SQLite lead() 函数使用指南
SQLite lead()
函数返回来自当前行所在的分区内当前行之后的指定行之内的行的值。
lead()
语法
这里是 SQLite lead()
函数的语法:
lead(expr[, offset[, default]])
OVER (
[PARTITION BY partition_column_list]
[ORDER BY order_column_list]
)
参数
expr
- 必需的。它可以是一个列名或者表达式。
offset
- 可选的。相对于当前行的偏移的行数。默认值为 1。
default
- 可选的。它可以是一个列名或者表达式。
partition_column_list
- 参与分区的列的列表。
order_column_list
- 参与排序的列的列表。
返回值
SQLite lead()
函数返回来自当前行所在的分区内当前行之后的指定行之内的行的值。
lead()
示例
演示数据准备
使用下面的 CREATE TABLE
语句创建一个表 tax_revenue
以存储每季度的税收收益:
CREATE TABLE tax_revenue (
id INTEGER PRIMARY KEY,
year CHAR(4) NOT NULL,
quarter CHAR(1) NOT NULL,
revenue INT NOT NULL
);
这里创建了一个 tax_revenue
表,它有 5 个列:
id
- 行 ID,主键。year
- 年份。quarter
- 季节,1 - 4。revenue
- 税收收益。
使用下面的 INSERT
语句向 tax_revenue
表中插入一些行:
INSERT INTO tax_revenue
(year, quarter, revenue)
VALUES
('2020', '1', 3515),
('2020', '2', 3678),
('2020', '3', 4203),
('2020', '4', 3924),
('2021', '1', 3102),
('2021', '2', 3293),
('2021', '3', 3602),
('2021', '4', 2901);
使用下面的 SELECT
语句检索表中的数据:
SELECT * FROM tax_revenue;
id year quarter revenue
-- ---- ------- -------
1 2020 1 3515
2 2020 2 3678
3 2020 3 4203
4 2020 4 3924
5 2021 1 3102
6 2021 2 3293
7 2021 3 3602
8 2021 4 2901
使用 SQLite lead()
函数和上一季度的收益比较
下面的语句,在使用 SQLite lead()
函数在每行中添加 last_quarter_revenue
列以比较当前季度和上一季度的收益:
SELECT
*,
lead(revenue, 1) OVER (
PARTITION BY year
ORDER BY quarter DESC
) last_quarter_revenue
FROM tax_revenue;
id year quarter revenue last_quarter_revenue
-- ---- ------- ------- --------------------
4 2020 4 3924 4203
3 2020 3 4203 3678
2 2020 2 3678 3515
1 2020 1 3515
8 2021 4 2901 3602
7 2021 3 3602 3293
6 2021 2 3293 3102
5 2021 1 3102
注意,上面 SQL 语句中的窗口函数:
lead(revenue, 1) OVER (
PARTITION BY year
ORDER BY quarter DESC
) last_quarter_revenue
在 OVER
子句中,
PARTITION BY year
将所有行按照年份进行分区ORDER BY quarter DESC
将每个分区内的行按照季度逆序排列。lead(revenue, 1)
返回每行在其关联的分区内之后一行(1
)中的收益(revenue
)。
那么在 last_quarter_revenue
列中存放的就是当前行的上一个季度的收益。所以,每个分区的最后一行中的 last_quarter_revenue
列的值为 null。
当然,您可以为 last_quarter_revenue
列中的 null 值指定要给默认值。下面的语句使用了 0
作为默认值:
SELECT
*,
lead(revenue, 1, 0) OVER (
PARTITION BY year
ORDER BY quarter DESC
) last_quarter_revenue
FROM tax_revenue;
id year quarter revenue last_quarter_revenue
-- ---- ------- ------- --------------------
4 2020 4 3924 4203
3 2020 3 4203 3678
2 2020 2 3678 3515
1 2020 1 3515 0
8 2021 4 2901 3602
7 2021 3 3602 3293
6 2021 2 3293 3102
5 2021 1 3102 0