問題:對(duì)于數(shù)字列中的值,計(jì)算其累計(jì)差。例如,計(jì)算DEPTNO 10中工資的累計(jì)差。要返回下列結(jié)果集:
ENAME SAL RUNNING_DIFF
---------- ---------- ------------
MILLER 1300 1300
CLARK 2450 -1150
KING 5000 -6150
解決方案
DB2和Oracle
使用窗口函數(shù)SUM OVER創(chuàng)建累計(jì)差:
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
使用標(biāo)量子查詢計(jì)算累計(jì)差:
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
討論
該解決方案與“生成累計(jì)和”一節(jié)介紹的解決方案大致相同。唯一的差別是:SAL除了第一個(gè)值(因?yàn)橐獜腄EPTNO 10的SAL開始)之外,其余所有值都返回負(fù)值。