窗口函数
通过使用窗口函数,您可以更高效地创建分析业务查询。窗口函数运行于分区或结果集的“窗口”上,并为该窗口中的每个行返回一个值。相比之下,非窗口函数执行与结果集中的每个行相关的计算。与聚合结果行的分组函数不同,窗口函数在表的表达式中的保留所有行。
使用该窗口中的行集中的值计算返回的值。对于表中的每一行,窗口定义一组用于计算其他属性的行。窗口使用窗口规范(OVER 子句)进行定义并基于以下三个主要概念:
-
窗口分区,构成了行组(PARTITION 子句)
-
窗口排序,定义了每个分区中行的顺序或序列(ORDER BY 子句)
-
窗口框架,相对于每个行进行定义以进一步限制行集(ROWS 规范)
窗口函数是在查询中执行的最后一组操作(最后的 ORDER BY 子句除外)。所有联接和所有 WHERE、GROUP BY 和 HAVING 子句均在处理窗口函数前完成。因此,窗口函数只能显示在选择列表或 ORDER BY 子句中。您可以在一个具有不同框架子句的查询中使用多个窗口函数。您还可以在其他标量表达式(如 CASE)中使用窗口函数。
Amazon Redshift 支持以下两种类型的窗口函数:聚合和排名。
以下是受支持的聚合函数:
-
AVG
-
COUNT
-
CUME_DIST
-
DENSE_RANK
-
FIRST_VALUE
-
LAG
-
LAST_VALUE
-
LEAD
-
LISTAGG
-
MAX
-
MEDIAN
-
MIN
-
NTH_VALUE
-
PERCENTILE_CONT
-
PERCENTILE_DISC
-
RATIO_TO_REPORT
-
STDDEV_POP
-
STDDEV_SAMP(STDDEV 的同义词)
-
SUM
-
VAR_POP
-
VAR_SAMP(VARIANCE 的同义词)
以下是受支持的排名函数:
-
DENSE_RANK
-
NTILE
-
PERCENT_RANK
-
RANK
-
ROW_NUMBER
主题
- 窗口函数语法摘要
- 窗口函数的唯一数据排序
- 窗口函数示例的示例表
- AVG 窗口函数
- COUNT 窗口函数
- CUME_DIST 开窗函数
- DENSE_RANK 窗口函数
- FIRST_VALUE 和 LAST_VALUE 窗口函数
- LAG 窗口函数
- LEAD 窗口函数
- LISTAGG 窗口函数
- MAX 窗口函数
- MEDIAN 开窗函数
- MIN 窗口函数
- NTH_VALUE 窗口函数
- NTILE 窗口函数
- PERCENT_RANK 开窗函数
- PERCENTILE_CONT 开窗函数
- PERCENTILE_DISC 开窗函数
- RANK 窗口函数
- RATIO_TO_REPORT 开窗函数
- ROW_NUMBER 窗口函数
- STDDEV_SAMP 和 STDDEV_POP 窗口函数
- SUM 窗口函数
- VAR_SAMP 和 VAR_POP 窗口函数
窗口函数示例的示例表
您可以通过每个函数描述找到特定的窗口函数示例。其中一些示例使用一个名为 WINSALES 的表,该表包含 11 个行,如下所示。
| SALESID | DATEID | SELLERID | BUYERID | QTY | QTY_SHIPPED |
|---|---|---|---|---|---|
| 30001 | 8/2/2003 | 3 | B | 10 | 10 |
| 10001 | 12/24/2003 | 1 | C | 10 | 10 |
| 10005 | 12/24/2003 | 1 | A | 30 | |
| 40001 | 1/9/2004 | 4 | A | 40 | |
| 10006 | 1/18/2004 | 1 | C | 10 | |
| 20001 | 2/12/2004 | 2 | B | 20 | 20 |
| 40005 | 2/12/2004 | 4 | A | 10 | 10 |
| 20002 | 2/16/2004 | 2 | C | 20 | 20 |
| 30003 | 4/18/2004 | 3 | B | 15 | |
| 30004 | 4/18/2004 | 3 | B | 20 | |
| 30007 | 9/7/2004 | 3 | C | 30 |
以下脚创建并填充示例 WINSALES 表。
CREATE TABLE winsales( salesid int, dateid date, sellerid int, buyerid char(10), qty int, qty_shipped int); INSERT INTO winsales VALUES (30001, '8/2/2003', 3, 'b', 10, 10), (10001, '12/24/2003', 1, 'c', 10, 10), (10005, '12/24/2003', 1, 'a', 30, null), (40001, '1/9/2004', 4, 'a', 40, null), (10006, '1/18/2004', 1, 'c', 10, null), (20001, '2/12/2004', 2, 'b', 20, 20), (40005, '2/12/2004', 4, 'a', 10, 10), (20002, '2/16/2004', 2, 'c', 20, 20), (30003, '4/18/2004', 3, 'b', 15, null), (30004, '4/18/2004', 3, 'b', 20, null), (30007, '9/7/2004', 3, 'c', 30, null);