在 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; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |