Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

WINDOW 子句

在 SELECT 语句中,WINDOW 子句用于定义全部或部分与窗口函数一起使用的窗口,例如 AVG 和 RANK。

语法
WINDOW window-expression, ...
window-expression : new-window-name AS ( window-spec )
window-spec :
[ existing-window-name ]
[ PARTITION BY expression, ... ]
[ ORDER BY expression [ ASC | DESC ], ... ]
[ { ROWS | RANGE } { window-frame-start | window-frame-between } ] 
window-frame-start :
{ UNBOUNDED PRECEDING
 | unsigned-integer PRECEDING
 | CURRENT ROW }
window-frame-between :
BETWEEN window-frame-bound1 AND window-frame-bound2
window-frame-bound :
window-frame-start
| UNBOUNDED FOLLOWING 
| unsigned-integer FOLLOWING
参数
  • PARTITION BY 子句   PARTITION BY 子句将结果集组织到基于指定表达式的唯一值的逻辑组中。当此子句与窗口函数一起使用时,函数将独立地应用于每个分区。例如,如果 PARTITION BY 后跟列名,则将按该列中的不同值对结果集进行分区。

    如果忽略此子句,则会将整个结果集考虑为一个分区。

    PARTITION BY expression 不能是整数值。

  • ORDER BY 子句   ORDER BY 子句定义如何对结果集的每个分区中的行进行排序。通过指定 ASC 按升序排序(缺省值)或 DESC 按降序排序,可进一步控制顺序。

    ORDER BY expression 不能是整数值。

    如果省略此子句,SQL Anywhere 会以最有效的顺序返回行,而且结果集的外观会根据用户上次访问行的时间而有所不同。

  • ROWS 子句和 RANGE 子句   ROWS 或 RANGE 子句均可用于表示窗口的大小。窗口的大小可以是分区的一行、多行或所有行。可根据当前行中值的数据值偏移范围 (RANGE) 或根据当前行中的物理行偏移数 (ROWS) 表示窗口的大小。

    使用 RANGE 子句时,还必须指定 ORDER BY 子句,因为范围计算需要存储值。范围的 ORDER BY 子句必须包含一个表达式,且该表达式必须产生一个日期或数字值。

    如果不指定 ROWS 或 RANGE 子句,数据库服务器将根据是否存在 ORDER BY 子句来使用缺省窗口大小。有关缺省值的信息,请参见定义窗口

    • PRECEDING 子句   PRECEDING 子句用于使用当前行作为参照点来定义窗口的第一行。起始行可根据当前行之前的行数来表示。例如,5 PRECEDING 设置窗口从当前行之前的第五行开始。

      UNBOUNDED PRECEDING 用于将窗口中的第一行设置为分区中的第一行。

    • BETWEEN 子句   BETWEEN 子句用于使用当前行作为参照点来定义窗口的第一行和最后一行。第一行和最后一行可分别根据当前行之前和之后的行数来表示。例如,BETWEEN 3 PRECEDING AND 5 FOLLOWING 设置窗口从当前行之前的第三行开始,结束于当前行之后的第五行。

      BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 用于将窗口中的第一行和最后一行分别设置为分区中的第一行和最后一行。这等同于未指定 ROW 或 RANGE 子句时的缺省行为。

    • FOLLOWING 子句   FOLLOWING 子句用于使用当前行作为参照点来定义窗口的最后一行。最后一行可根据当前行之后的行数来表示。

      UNBOUNDED FOLLOWING 用于将窗口中的最后一行设置为分区中的最后一行。

注释

在 SELECT 语句中,WINDOW 子句必须在 ORDER BY 子句之前显示。

除 LIST 函数外,全部的集合函数都可用作窗口函数。但秩集合函数(RANK、DENSE_RANK、PERCENT_RANK、CUME_DIST 和 ROW_NUMBER)需要 ORDER BY 子句,且不允许 WINDOW 子句或内置定义中包含 ROW 或 RANGE 子句。对于所有其它窗口功能,可使用任何子句。

有关定义和使用窗口以获得所需结果的详细信息,请参见定义窗口窗口定义:内置与 WINDOW 子句

另请参见
标准和兼容性
  • SQL/2003   SQL/2003 特性 T611、T612。

示例

以下示例返回雇员的薪水以及所选状态中全部雇员的平均薪水。结果先按照状态排序,然后按照姓排序。

SELECT EmployeeID, Surname, Salary, State,
  AVG( Salary ) OVER SalaryWindow
FROM Employees
WINDOW SalaryWindow AS ( PARTITION BY State )
ORDER BY State, Surname;