- 类别:
:doc:`/sql-reference/functions-window-syntax`(排名)
LAG¶
访问同一结果集中前一行的数据(无需将表与其自身联接)。
- 另请参阅:
语法¶
LAG ( <expr> [ , <offset> , <default> ] ) [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
实参¶
expr
根据指定偏移量返回的表达式。
offset
从可从中获取值的当前行向后排列行数。例如,若
offset
为 2,会返回间隔为 2 行的expr
值。请注意,使用 LEAD 函数来设置负偏移量具有相同的效果。
默认值为 1。
default
当偏移量超出窗口边界时要返回的表达式。支持其类型与
expr
兼容的任何表达式。默认值为 NULL。
{ IGNORE | RESPECT } NULLS
当
expr
包含 NULL 值时,是忽略还是遵照 NULL 值:IGNORE NULLS
排除计算偏移行时其表达式计算结果为 NULL 的任何行。RESPECT NULLS
包括计算偏移行时其表达式计算结果为 NULL 的任何行。
默认值:
RESPECT NULLS
使用说明¶
此 PARTITION BY 子句将 FROM 子句生成的结果集划分入应用该函数的分区。有关更多信息,请参阅 窗口函数的语法和用法。
此 ORDER BY 子句对每个分区中的数据进行排序。
示例¶
创建表并加载数据:
CREATE OR REPLACE TABLE sales(
emp_id INTEGER,
year INTEGER,
revenue DECIMAL(10,2));
INSERT INTO sales VALUES
(0, 2010, 1000),
(0, 2011, 1500),
(0, 2012, 500),
(0, 2013, 750);
INSERT INTO sales VALUES
(1, 2010, 10000),
(1, 2011, 12500),
(1, 2012, 15000),
(1, 2013, 20000);
INSERT INTO sales VALUES
(2, 2012, 500),
(2, 2013, 800);
此查询显示今年的收入与上一年的收入之间的差额:
SELECT emp_id, year, revenue,
revenue - LAG(revenue, 1, 0) OVER (PARTITION BY emp_id ORDER BY year) AS diff_to_prev
FROM sales
ORDER BY emp_id, year;
+--------+------+----------+--------------+
| EMP_ID | YEAR | REVENUE | DIFF_TO_PREV |
|--------+------+----------+--------------|
| 0 | 2010 | 1000.00 | 1000.00 |
| 0 | 2011 | 1500.00 | 500.00 |
| 0 | 2012 | 500.00 | -1000.00 |
| 0 | 2013 | 750.00 | 250.00 |
| 1 | 2010 | 10000.00 | 10000.00 |
| 1 | 2011 | 12500.00 | 2500.00 |
| 1 | 2012 | 15000.00 | 2500.00 |
| 1 | 2013 | 20000.00 | 5000.00 |
| 2 | 2012 | 500.00 | 500.00 |
| 2 | 2013 | 800.00 | 300.00 |
+--------+------+----------+--------------+
创建另一个表并加载数据:
CREATE OR REPLACE TABLE t1 (
col_1 NUMBER,
col_2 NUMBER);
INSERT INTO t1 VALUES
(1, 5),
(2, 4),
(3, NULL),
(4, 2),
(5, NULL),
(6, NULL),
(7, 6);
此查询显示了 IGNORE NULLS 子句对输出的影响。即使前一行包含 NULL,所有行(第一行除外)都包含非 NULL 值。如果前一行包含 NULL,则当前行使用最新的非 NULL 值。
SELECT col_1,
col_2,
LAG(col_2) IGNORE NULLS OVER (ORDER BY col_1)
FROM t1
ORDER BY col_1;
+-------+-------+-----------------------------------------------+
| COL_1 | COL_2 | LAG(COL_2) IGNORE NULLS OVER (ORDER BY COL_1) |
|-------+-------+-----------------------------------------------|
| 1 | 5 | NULL |
| 2 | 4 | 5 |
| 3 | NULL | 4 |
| 4 | 2 | 4 |
| 5 | NULL | 2 |
| 6 | NULL | 2 |
| 7 | 6 | 2 |
+-------+-------+-----------------------------------------------+