LEAD 窗口函数 - Amazon Redshift

LEAD 窗口函数

LEAD 窗口函数返回位于分区中当前行的下方(之后)的某个给定偏移量位置的行的值。

语法

LEAD (value_expr [, offset ]) [ IGNORE NULLS | RESPECT NULLS ] OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )

参数

value_expr

对其执行函数的目标列或表达式。

offset

一个可选参数,该参数指定要返回其值的当前行后面的行数。偏移量可以是常量整数或计算结果为整数的表达式。如果您未指定偏移量,则 Amazon Redshift 使用 1 作为默认值。偏移量为 0 表示当前行。

IGNORE NULLS

一个可选规范,该规范指示 Amazon Redshift 应跳过 null 值以确定要使用的行。如果未列出 IGNORE NULLS,则包含 Null 值。

注意

您可以使用 NVL 或 COALESCE 表达式将 null 值替换为另一个值。有关更多信息,请参阅 NVL 和 COALESCE 函数

RESPECT NULLS

指示 Amazon Redshift 应包含 null 值以确定要使用的行。如果您未指定 IGNORE NULLS,则默认情况下不支持 RESPECT NULLS。

OVER

指定窗口分区和排序。OVER 子句不能包含窗口框架规范。

PARTITION BY window_partition

一个可选参数,该参数设置 OVER 子句中每个组的记录范围。

ORDER BY window_ordering

对每个分区中的行进行排序。

LEAD 窗口函数支持使用任何 Amazon Redshift 数据类型的表达式。返回类型与 value_expr 的类型相同。

示例

以下示例提供了 SALES 表中于 2008 年 1 月 1 日与 1 月 2 日已售票的事件的佣金以及为后续销售中售票所付的佣金。以下示例使用 TICKIT 示例数据库。有关更多信息,请参阅 示例数据库

SELECT eventid, commission, saletime, LEAD(commission, 1) over ( ORDER BY saletime ) AS next_comm FROM sales WHERE saletime BETWEEN '2008-01-09 00:00:00' AND '2008-01-10 12:59:59' LIMIT 10; +---------+------------+---------------------+-----------+ | eventid | commission | saletime | next_comm | +---------+------------+---------------------+-----------+ | 1664 | 13.2 | 2008-01-09 01:00:21 | 69.6 | | 184 | 69.6 | 2008-01-09 01:00:36 | 116.1 | | 6870 | 116.1 | 2008-01-09 01:02:37 | 11.1 | | 3718 | 11.1 | 2008-01-09 01:05:19 | 205.5 | | 6772 | 205.5 | 2008-01-09 01:14:04 | 38.4 | | 3074 | 38.4 | 2008-01-09 01:26:50 | 209.4 | | 5254 | 209.4 | 2008-01-09 01:29:16 | 26.4 | | 3724 | 26.4 | 2008-01-09 01:40:09 | 57.6 | | 5303 | 57.6 | 2008-01-09 01:40:21 | 51.6 | | 3678 | 51.6 | 2008-01-09 01:42:54 | 43.8 | +---------+------------+---------------------+-----------+

以下示例提供了 SALES 表中各个活动的佣金与同一活动后续销售的门票销售佣金的最大差异。此示例显示了如何将 LEAD 与 GROUP BY 子句一起使用。由于聚合子句中不支持使用窗口函数,因此该示例使用子查询。以下示例使用 TICKIT 示例数据库。有关更多信息,请参阅 示例数据库

SELECT eventid, eventname, max(next_comm_diff) as max_commission_difference FROM ( SELECT sales.eventid, eventname, commission - LEAD(commission, 1) over (ORDER BY sales.eventid, saletime) AS next_comm_diff FROM sales JOIN event ON sales.eventid = event.eventid ) GROUP BY eventid, eventname ORDER BY eventid LIMIT 10 | eventid | eventname | max_commission_difference | +---------+-----------------------------+---------------------------+ | 1 | Gotterdammerung | 7.95 | | 2 | Boris Godunov | 227.85 | | 3 | Salome | 1350.9 | | 4 | La Cenerentola (Cinderella) | 790.05 | | 5 | Il Trovatore | 214.05 | | 6 | L Elisir d Amore | 510.9 | | 7 | Doctor Atomic | 180.6 | | 9 | The Fly | 147 | | 10 | Rigoletto | 186.6 | +---------+-----------------------------+---------------------------+