您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

行间函数

通过行间函数 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 的数据类型必须可隐式转换为 值的数据类型,否则 SAP IQ 将生成转换错误。

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