2011-03-07 2 views
0

감안할 데이터 :열의 모든 값의 합계가 지정된 값에 도달하는 행을 찾는 방법은 무엇입니까? 다음 스키마와 테이블의

CREATE TABLE purchases (timestamp DATETIME, quantity INT) 

나는 시점을 찾고자하는 (즉, 행의 타임 스탬프) 수량 열의 값의 합이 특정 임계 값을 통과 값.

이것은 MS SQL Server에 있으며 가능한 경우 커서를 사용하지 않는 것이 이상적입니다.

+0

샘플 데이터를 제공 할 수 있습니까? 이것은 주어진 타임 스탬프 또는 실행중인 SUM에서 SUM입니까? – gbn

+0

힙입니까, 아니면 (타임 스탬프)에 대한 인덱스가 있습니까? – PerformanceDBA

답변

2
SELECT timestamp, SUM(quantity) 
FROM purchases 
GROUP BY timestamp 
HAVING SUM(quantity) > someValue 

아니면 실행중인 합계

SELECT a1.timestamp 
FROM purchases a1, purchases a2 
WHERE a1.quantity >= a2.quantity or (a1.quantity=a2.quantity and a1.timestamp = a2.timestamp) 
GROUP BY a1.timestamp, a1.quantity 
having SUM(a2.quantity) >= someValue 
ORDER BY a1.timestamp ASC 
LIMIT 1 
1

이전 값의 합이 임계 값보다 큰 경우 당신은 작은 타임 스탬프를 얻을 수있는 경우 : 그러나

select min(timestamp) 
from purchases p 
where (
    select sum(x.quantity) 
    from purchases x 
    where x.timestamp < p.timestamp 
) > @threshold 

,이 매우 효율적인 쿼리가 아니므로 결국 커서를 사용하는 것이 좋습니다. 당신이 시도 할 수 2005 + SQL 서버에서

+0

bounds error, timestamp <= timestamp – RichardTheKiwi

+0

OP에 타임 스탬프에 대한 인덱스가 있고 오름차순이면 MAX()가 MIN()이 아님을 가정합니다. – PerformanceDBA

+0

또는 연산자가 '<' to '>'에서 변경되었습니다. – Guffa

0

: 기본적으로

;WITH numbered AS (
    SELECT 
    timestamp, 
    quantity, 
    rownum = ROW_NUMBER() OVER (ORDER BY timestamp) 
    FROM purchases 
), 
recursive AS (
    SELECT 
    timestamp, 
    quantity, 
    rownum, 
    runningsum = quantity, 
    passed = CASE WHEN n.quantity < @threshold THEN 0 ELSE 1 END 
    FROM numbered 
    UNION ALL 
    SELECT 
    n.timestamp, 
    n.quantity, 
    n.rownum, 
    runningsum = n.quantity + r.runningsum, 
    passed = CASE WHEN n.quantity + r.runningsum < @threshold THEN 0 ELSE 1 END 
    FROM numbered n 
    INNER JOIN recursive r ON n.rownum = r.rownum + 1 
) 
SELECT MIN(timestamp) 
FROM recursive 
WHERE passed = 1 

, @Guffa의 솔루션과 동일 만 가입 삼각형의 필요성을 피하기 위해 열팽창 계수를 사용한다.

+0

@ 리차드 : 고마워요. –

관련 문제