SQL窗口函数之LAG函数
例子
-- 计算销量环比增幅
SELECT amount / lag(amount) OVER (ORDER BY time) FROM sales;
-- 计算每一行的销量占所属地区的销量百分比
SELECT amount / sum(amount) OVER (PARTITION BY region) FROM sales;
-- 计算差分
SELECT amount - lag(amount) OVER (ORDER BY time) FROM sales;
LAG
在 SQL 中,LAG
函数是一种窗口函数,它用于访问结果集中当前行的前面的行中的数据。它常常用于分析数据中的时间序列或其他按照某种顺序排列的数据。LAG
函数允许你在查询结果中回看若干行,并从中提取信息,非常适合用来进行数据比较或计算数据变化。
语法
LAG
函数的基本语法如下:
LAG(expression, offset, default) OVER (partition_order_by_clause)
- expression: 这是你希望从前面的行中获取的字段或计算表达式。
- offset: 这是一个可选参数,用于指定你想要回看多少行。默认值是 1,表示回看前一行。
- default: 这也是一个可选参数,用来定义当没有足够的行可供回看时的返回值(即当前行之前的行数少于指定的 offset)。如果未指定,当没有可回看的行时,默认返回
NULL
。 - partition_order_by_clause: 这定义了
LAG
函数操作的数据窗口。它通常包含ORDER BY
子句来指定数据的排序方式,也可以包含PARTITION BY
子句来分组数据。
示例
当输入如下查询语句,查询股票数据的差分
SELECT
date,
InnerCode,
close,
close - LAG(close, 1, NULL) OVER (PARTITION BY InnerCode ORDER BY date) AS close_change
FROM
stk_day
WHERE
date >= '2019-01-01' AND date <= '2019-01-07';
返回结果如下:
date | InnerCode | close | close_change |
---|---|---|---|
2019-01-02 00:00:00 | 85 | 7.16 | nan |
2019-01-03 00:00:00 | 85 | 7 | -0.16 |
2019-01-04 00:00:00 | 85 | 7.12 | 0.12 |
2019-01-07 00:00:00 | 85 | 7.15 | 0.03 |
2019-01-02 00:00:00 | 3 | 9.19 | nan |
2019-01-03 00:00:00 | 3 | 9.28 | 0.09 |
2019-01-04 00:00:00 | 3 | 9.75 | 0.47 |
2019-01-07 00:00:00 | 3 | 9.74 | -0.01 |