與累加相反,階梯式累減用於計算「當前值與下一筆值的差異」,常見於:
SELECT * INTO #t FROM (
SELECT 'a1' AS t1, 440 AS t2, 1 AS t3 UNION ALL
SELECT 'a2', 445, 2 UNION ALL
SELECT 'a3', 253, 3 UNION ALL
SELECT 'a4', 509, 4 UNION ALL
SELECT 'a5', 376, 5 UNION ALL
SELECT 'a6', 142, 6
) a;
SELECT * FROM #t ORDER BY t3;
SELECT
b1.t1,
b1.t2,
b1.t3,
b1.t2 - (SELECT TOP 1 b2.t2 FROM #t b2 WHERE b1.t3 < b2.t3 ORDER BY b2.t3) AS DiffToNext
FROM #t b1
ORDER BY b1.t3;
WHERE b1.t3 < b2.t3 找出排序順序在當前列之後的所有列。TOP 1 ... ORDER BY b2.t3 取最接近的下一筆(最小的較大 t3)。| t1 | t2 | t3 | DiffToNext (t2 - Next_t2) |
|---|---|---|---|
| a1 | 440 | 1 | -5 (440-445) |
| a2 | 445 | 2 | 192 (445-253) |
| a3 | 253 | 3 | -256 (253-509) |
| a4 | 509 | 4 | 133 (509-376) |
| a5 | 376 | 5 | 234 (376-142) |
| a6 | 142 | 6 | NULL |
SELECT
t1, t2, t3,
t2 - LEAD(t2) OVER (ORDER BY t3) AS DiffToNext
FROM #t
ORDER BY t3;
優點:單次掃描、語意清晰、可指定預設值 LEAD(t2, 1, 0) OVER (...) 避免 NULL。
DROP TABLE #t;