具有物理偏移的窗口 (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 按以下方式处理窗口框架子句:

  1. 创建第一个窗口(绿方框)。此窗口包含一个行,因为当前行(蓝方框)也是此分区的第一个行。因此,count 列中的值显示了当前窗口中的行数,即 1:

  2. COUNT 处理此分区的第一行之后,它会将当前行重置为此分区的第二个行。窗口此时跨越了当前行和前面的一个行,因此,COUNT 返回了值 2:

  3. COUNT 处理此分区的第二行之后,它会将当前行重置为此分区的第三个行。窗口此时跨越了当前行和前面的两个行,因此,COUNT 返回了值 3:

  4. 此后,COUNT 继续处理剩余的分区行,并相应地移动窗口,但窗口大小 (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) 不变,仍为三行。因此,count 列中的值也不变 (3):