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