具有物理偏移的窗口 (ROWS)
窗口物理框架子句中的 ROWS
关键字将窗口大小指定为相对于当前行的行数。值只能为 INTEGER
数据类型。
注意
具有物理偏移的分析函数返回的值会产生不具确定性的结果,除非排序表达式生成了唯一排序。要实现唯一排序,窗口顺序子句可能需要指定多个列。示例
此页面中的示例使用 emp
表架构:
CREATE TABLE emp(deptno INT, sal INT, empno INT);
INSERT INTO emp VALUES(10,101,1);
INSERT INTO emp VALUES(10,104,4);
INSERT INTO emp VALUES(20,100,11);
INSERT INTO emp VALUES(20,109,7);
INSERT INTO emp VALUES(20,109,6);
INSERT INTO emp VALUES(20,109,8);
INSERT INTO emp VALUES(20,110,10);
INSERT INTO emp VALUES(20,110,9);
INSERT INTO emp VALUES(30,102,2);
INSERT INTO emp VALUES(30,103,3);
INSERT INTO emp VALUES(30,105,5);
COMMIT;
以下查询调用 COUNT
来对当前行及其前面的行(最多两行)进行计数:
SELECT deptno, sal, empno, COUNT(*) OVER
(PARTITION BY deptno ORDER BY sal ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
AS count FROM emp;
OVER
子句包含三个组件:
-
窗口分区子句
PARTITION BY deptno
-
排序依据子句
ORDER BY sal
-
窗口框架子句
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
。此子句将窗口大小定义为从当前行扩展到当前行前面的两个行。
查询返回的结果分为三个分区,在下文中以红线表示。在第二个分区 (deptno=20
) 中,COUNT
按以下方式处理窗口框架子句:
-
创建第一个窗口(绿方框)。此窗口包含一个行,因为当前行(蓝方框)也是此分区的第一个行。因此,
count
列中的值显示了当前窗口中的行数,即 1: -
COUNT
处理此分区的第一行之后,它会将当前行重置为此分区的第二个行。窗口此时跨越了当前行和前面的一个行,因此,COUNT
返回了值 2: -
COUNT
处理此分区的第二行之后,它会将当前行重置为此分区的第三个行。窗口此时跨越了当前行和前面的两个行,因此,COUNT
返回了值 3: -
此后,
COUNT
继续处理剩余的分区行,并相应地移动窗口,但窗口大小 (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) 不变,仍为三行。因此,count
列中的值也不变 (3):