oracle sum()over()问题

今天写sql的时候根据业务场景要用到sum over这个分析函数,以emp表做例子,举例代码如下:

select deptno,
       ename,
       sal,
       sum(sal) over(partition by deptno order by deptno desc, sal desc ) dept_sum,
  from emp;


执行这个语句的时候,当碰到下面图这样deptno和sal数字一致的情况下,sum会直接给出两个相同数字与上级相加的结果,而不是仅与上级相加的结果,请问有办法能达到只用下级与上级相加的目的吗?就是下图只让5950+1250,而不是5950+1250*2

img

这个问题其实很简单,在你分析函数中的order by 后面,再接一个每一行都有不同值的列就是了,比如员工id,甚至直接用个rownum也行,

select deptno,
       ename,
       sal,
       sum(sal) over(partition by deptno order by deptno desc, sal desc ,rownum) dept_sum
  from emp;

你这个是想对分组窗口的每一行,累计从第一行到当前行的值,但是你这个排序却没有进行绝对的排序,只根据deptno 和sal排序 ,可能每次排序的结果都会不一样。

另外,其实还有更加精准的统计分组窗口的第一行到当前行的方式

sum(salary ) over (partition by deptno order by salary desc rows between 1 preceding and current row)

sum(salary ) over (partition by deptno order by salary desc groups between 1 preceding and current row)

sum(salary ) over (partition by deptno order by salary desc range between 1 preceding and current row)

参考