问题:对于数字列中的值,计算其累计差。例如,计算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开始)之外,其余所有值都返回负值。