누적 합계를 계산하려합니다.다른 컬럼을 기반으로 누적 합계를 재설정하십시오.
이;WITH cte
AS (SELECT id,
val,
reset_val,
val AS running_total
FROM #reset_runn_total
WHERE id = 1
UNION ALL
SELECT r.*,
CASE
WHEN lag(c.running_total + r.val) over(order by r.id) > lag(r.reset_val) over(order by r.id) THEN r.reset_val
ELSE c.running_total + r.val
END
FROM cte c
JOIN #reset_runn_total r
ON r.id = c.id + 1)
SELECT *
FROM cte
분명히 뜻을 지연 : 또 다른 열 값보다 cummulative 합보다
create table #reset_runn_total
(
id int identity(1,1),
val int,
reset_val int
)
insert into #reset_runn_total
values
(1,10),
(8,12),(6,14),(5,10),(6,13),(3,11),(9,8),(10,12)
샘플 데이터
+----+-----+-----------+
| id | val | reset_val |
+----+-----+-----------+
| 1 | 1 | 10 |
| 2 | 8 | 12 |
| 3 | 6 | 14 |
| 4 | 5 | 10 |
| 5 | 6 | 13 |
| 6 | 3 | 11 |
| 7 | 9 | 8 |
| 8 | 10 | 12 |
+----+-----+-----------+
예상 결과가
+----+-----+-----------------+-------------+
| id | val | reset_val | Running_tot |
+----+-----+-----------------+-------------+
| 1 | 1 | 10 | 1 |
| 2 | 8 | 12 | 9 | --1+8
| 3 | 6 | 14 | 15 | --1+8+6 -- greater than reset val
| 4 | 5 | 10 | 5 | --reset
| 5 | 6 | 13 | 11 | --5+6
| 6 | 3 | 11 | 14 | --5+6+3 -- greater than reset val
| 7 | 9 | 8 | 9 | --reset -- greater than reset val
| 8 | 10 | 12 | 10 | --reset
+----+-----+-----------------+-------------+
쿼리 때 그것을 다시 설정해야합니다 ~하지 마라. 이전 값은 어떤 아이디어입니까?
와우 .. Sum() Over() 창 집계를 사용하여이 작업을 수행 할 수 있습니까? –
또는 '재귀 적 CTE'를 사용하지 않습니까? –
재귀가 피할 수없는 것처럼 보입니다 ... – Serg