窗口函数 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

窗口函数

通过使用窗口函数,您可以使用户更高效地创建分析业务查询。窗口函数运行于分区或结果集的“窗口”上,并为该窗口中的每个行返回一个值。相比之下,非窗口函数执行与结果集中的每个行相关的计算。与聚合结果行的分组函数不同,表的表达式中的所有行都将保留。

使用该窗口中的行集中的值计算返回的值。对于表中的每一行,窗口定义一组用于计算其他属性的行。窗口使用窗口规范(OVER 子句)进行定义并基于以下三个主要概念:

  • 窗口分区,构成了行组(PARTITION 子句)

  • 窗口排序,定义了每个分区中行的顺序或序列(ORDER BY 子句)

  • 窗口框架,相对于每个行进行定义以进一步限制行集(ROWS 规范)

窗口函数是在查询中执行的最后一组操作(最后的 ORDER BY 子句除外)。所有联接和所有 WHERE、GROUP BY 和 HAVING 子句均在处理窗口函数前完成。因此,窗口函数只能显示在选择列表或 ORDER BY 子句中。您可以在一个具有不同框架子句的查询中使用多个窗口函数。您还可以在其他标量表达式(如 CASE)中使用窗口函数。

Amazon Redshift 支持以下两种类型的窗口函数:聚合和排名。

以下是受支持的聚合函数:

  • AVG

  • COUNT

  • CUME_DIST

  • FIRST_VALUE

  • LAG

  • LAST_VALUE

  • LEAD

  • 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

窗口函数概述示例

接下来,您可以找到一个概述示例,演示如何使用窗口函数。您还可以通过每个函数描述找到具体的代码示例。

其中一些窗口函数示例使用一个名为 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);