Oracle 分析 SUM SQL 不会在 window 中一次求和一个

Oracle analytics SUM SQL does not sum one at a time in window

问题

查看 SUM Analytic Function in Oracle Base 和 运行 SQL 期望 SUM 一次添加一行工资。

SELECT 
  deptno,
  ename,
  sal,
  SUM(sal)
    OVER (
      PARTITION BY deptno 
      ORDER BY sal 
      RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) 
    AS RUNNING_TOTAL_IN_DEPT
FROM
  emp
ORDER BY deptno, sal
;

但是,对于工资值相同的行,将工资值相同的行的小计相加。

DEPTNO  ENAME   SAL     RUNNING_TOTAL_IN_DEPT
20      SMITH   800     800
20      ADAMS   1100    1900
20      JONES   2975    4875
20      SCOTT   3000    10875 <--- Why not 7875? How to make this to 7875?
20      FORD    3000    10875 

30      JAMES   950     950
30      MARTIN  1250    3450 <--- Why not 2200?
30      WARD    1250    3450
30      TURNER  1500    4950
30      ALLEN   1600    6550

问题

请解释此行为以及如何一次添加一行总和,即使有多行具有相同的薪水值。

您使用的是 RANGE BETWEEN 而不是 ROWS BETWEENRANGE BETWEEN 将具有相同键值的所有行视为相同,因此它们都获得 "full" 值。

Oracle 文档对此没有很好的解释。 Here 是一个提供一些背景知识的博客 post。

你想要 ROWS BETWEEN 而不是 RANGE BETWEEN :

SELECT deptno, ename, sal,
       SUM(sal) OVER (PARTITION BY deptno ORDER BY sal 
                       ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RUNNING_TOTAL_IN_DEPT
FROM emp
ORDER BY deptno, sal;