通过行间函数 LAG 和 LEAD 可以访问数据系列中的先前值或后续值,或表中的多个行。
行间函数还同时进行分区,且无需自连接。通过 LAG 可以对位于表或分区中 CURRENT ROW 前面且与之相距给定物理偏移量的行进行访问。通过 LEAD 可以对位于表或分区中 CURRENT ROW 后面且与之相距给定物理偏移量的行进行访问。
LAG 和 LEAD 语法相同。这两个函数都需要 OVER (ORDER_BY) 窗口规范。例如:
LAG () [,< offset> [,< default>]]) OVER ([PARTITION BY ] ORDER BY ) 以及:
LEAD () [,< offset> [,< default>]]) OVER ([PARTITION BY ] ORDER BY ) OVER (ORDER_BY) 子句中的 PARTITION BY 子句是可选的。OVER (ORDER_BY) 子句不能包含窗口构架 ROWS/RANGE 规范。
对于这两个函数,可输入物理偏移量来指定目标行。<offset >值是指当前行上面或下面的行数。请输入非负数值数据类型(输入负值会生成错误)。如果输入 0,SAP IQ 会返回当前行。
可选的 offset >值超过表的范围时要返回的值。NULL。
LAG 示例 1 - 行间函数适用于对数据流进行计算的金融服务应用程序(如股票交易)。此示例使用 LAG 函数来计算特定股票的交易价格的百分比变化。假设有以下来自 stock_trades 虚构表的贸易数据:
traded at symbol price
------------------- ------ ------
2009-07-13 06:07:12 SQL 15.84
2009-07-13 06:07:13 TST 5.75
2009-07-13 06:07:14 TST 5.80
2009-07-13 06:07:15 SQL 15.86
2009-07-13 06:07:16 TST 5.90
2009-07-13 06:07:17 SQL 15.86
注意虚构表 stock_trades 在 iqdemo 数据库中不可用。
查询按照股票符号对交易进行分区,按照交易时间对它们进行排序,并使用 LAG 函数来计算当前交易和以前交易之间的交易价格增加或降低百分比:
select stock_symbol as 'Stock',
traded_at as 'Date/Time of Trade',
trade_price as 'Price/Share',
cast ( ( ( (trade_price
- (lag(trade_price, 1)
over (partition by stock_symbol
order by traded_at)))
/ trade_price)
* 100.0) as numeric(5, 2) )
as '% Price Change vs Previous Price'
from stock_trades
order by 1, 2
查询返回以下结果:
Stock Date/Time of Trade Price/ % Price Change_vs
symbol Share Previous Price
------ ------------------- ----- -----------------
SQL 2009-07-13 06:07:12 15.84 NULL
SQL 2009-07-13 06:07:15 15.86 0.13
SQL 2009-07-13 06:07:17 15.86 0.00
TST 2009-07-13 06:07:13 5.75 NULL
TST 2009-07-13 06:07:14 5.80 0.87
TST 2009-07-13 06:07:16 5.90 1.72
第一个和第四个输出行中的 NULL 结果表明 LAG 函数同时超出了两个分区中第一行的范围。由于没有先前行以供比较,SAP IQ 返回 NULL。