类别:

:doc:`/sql-reference/functions-window-syntax`(排名)

LAG

访问同一结果集中前一行的数据(无需将表与其自身联接)。

另请参阅:

LEAD

语法

LAG ( <expr> [ , <offset> , <default> ] ) [ { IGNORE | RESPECT } NULLS ]
    OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
Copy

实参

expr

根据指定偏移量返回的表达式。

offset

从可从中获取值的当前行向后排列行数。例如,若 offset 为 2,会返回间隔为 2 行的 expr 值。

请注意,使用 LEAD 函数来设置负偏移量具有相同的效果。

默认值为 1。

default

当偏移量超出窗口边界时要返回的表达式。支持其类型与 expr 兼容的任何表达式。

默认值为 NULL。

使用说明

  • 若设置 IGNORE NULLS 子句,在计算偏移行时,不包括其表达式计算结果为 NULL 的任何行。如果未指定 { IGNORE | RESPECT } NULLS,则默认值为 RESPECT NULLS

  • 此 PARTITION BY 子句将 FROM 子句生成的结果集划分入应用该函数的分区。有关更多信息,请参阅 窗口函数的语法和用法

  • 此 ORDER BY 子句对每个分区中的数据进行排序。

示例

创建表并加载数据:

CREATE OR REPLACE TABLE sales(emp_id INTEGER, year INTEGER, revenue DECIMAL(10,2));
Copy
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);
Copy

此查询显示今年的收入与上一年的收入之间的差额:

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 |
+--------+------+----------+--------------+
Copy

创建另一个表并加载数据:

CREATE OR REPLACE TABLE t1 (col_1 NUMBER, col_2 NUMBER);
Copy
INSERT INTO t1 VALUES 
    (1, 5),
    (2, 4),
    (3, NULL),
    (4, 2),
    (5, NULL),
    (6, NULL),
    (7, 6);
Copy

此查询显示了 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 |
+-------+-------+-----------------------------------------------+
Copy
语言: 中文