감안할 데이터 :열의 모든 값의 합계가 지정된 값에 도달하는 행을 찾는 방법은 무엇입니까? 다음 스키마와 테이블의
CREATE TABLE purchases (timestamp DATETIME, quantity INT)
나는 시점을 찾고자하는 (즉, 행의 타임 스탬프) 수량 열의 값의 합이 특정 임계 값을 통과 값.
이것은 MS SQL Server에 있으며 가능한 경우 커서를 사용하지 않는 것이 이상적입니다.
감안할 데이터 :열의 모든 값의 합계가 지정된 값에 도달하는 행을 찾는 방법은 무엇입니까? 다음 스키마와 테이블의
CREATE TABLE purchases (timestamp DATETIME, quantity INT)
나는 시점을 찾고자하는 (즉, 행의 타임 스탬프) 수량 열의 값의 합이 특정 임계 값을 통과 값.
이것은 MS SQL Server에 있으며 가능한 경우 커서를 사용하지 않는 것이 이상적입니다.
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
이전 값의 합이 임계 값보다 큰 경우 당신은 작은 타임 스탬프를 얻을 수있는 경우 : 그러나
select min(timestamp)
from purchases p
where (
select sum(x.quantity)
from purchases x
where x.timestamp < p.timestamp
) > @threshold
,이 매우 효율적인 쿼리가 아니므로 결국 커서를 사용하는 것이 좋습니다. 당신이 시도 할 수 2005 + SQL 서버에서
bounds error, timestamp <= timestamp – RichardTheKiwi
OP에 타임 스탬프에 대한 인덱스가 있고 오름차순이면 MAX()가 MIN()이 아님을 가정합니다. – PerformanceDBA
또는 연산자가 '<' to '>'에서 변경되었습니다. – Guffa
: 기본적으로
;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의 솔루션과 동일 만 가입 삼각형의 필요성을 피하기 위해 열팽창 계수를 사용한다.
@ 리차드 : 고마워요. –
샘플 데이터를 제공 할 수 있습니까? 이것은 주어진 타임 스탬프 또는 실행중인 SUM에서 SUM입니까? – gbn
힙입니까, 아니면 (타임 스탬프)에 대한 인덱스가 있습니까? – PerformanceDBA