問題:對于數字列中的值,計算其累計差。例如,計算DEPTNO 10中工資的累計差。要返回下列結果集:
ENAME SAL RUNNING_DIFF
---------- ---------- ------------
MILLER 1300 1300
CLARK 2450 -1150
KING 5000 -6150
解決方案
DB2和Oracle
使用窗口函數SUM OVER創建累計差:
1 select ename,sal,
2 sum(case when rn = 1 then sal else -sal end)
3 over(order by sal,empno) as running_diff<>5 select empno,ename,sal,
6 row_number()over(order by sal,empno) as rn
7 from emp
8 where deptno = 10
9 ) x
MySQL、PostgreSQL和SQL Server
使用標量子查詢計算累計差:
1 select a.empno, a.ename, a.sal,
2 (select case when a.empno = min(b.empno) then sum(b.sal)
3 else sum(-b.sal)
4 end
5 from emp b
6 where b.empno <= a.empno
7 and b.deptno = a.deptno ) as rnk
8 from emp a
9 where a.deptno = 10
討論
該解決方案與“生成累計和”一節介紹的解決方案大致相同。唯一的差別是:SAL除了第一個值(因為要從DEPTNO 10的SAL開始)之外,其余所有值都返回負值。