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 BETWEEN
。 RANGE 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;
问题
查看 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 BETWEEN
。 RANGE 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;