简述前后函数 lag(expr,n,defval)、lead(expr,n,defval) ?
lag()
和 lead()
是 SQL 中的窗口函数,它们分别用于获取当前行之前的行(滞后值)和之后的行(领先值)的指定表达式的值。这两个函数在数据分析中特别有用,尤其是当你需要比较时间序列数据中的当前值和前一个或后一个值时。
- lag(expr, n, defval)
expr
: 需要获取的列或表达式。n
: (可选)指定滞后的行数,即你想从当前行向前查看多少行。默认是 1。defval
: (可选)如果滞后的行不存在(例如,当前行是第一行,但你要求滞后 1 行),则返回此默认值。如果省略此参数且滞后的行不存在,则结果通常为 NULL。lag()
函数返回的是从当前行向前数n
行的expr
值。
- lead(expr, n, defval)
expr
: 需要获取的列或表达式。n
: (可选)指定领先的行数,即你想从当前行向后查看多少行。默认是 1。defval
: (可选)如果领先的行不存在(例如,当前行是最后一行,但你要求领先 1 行),则返回此默认值。如果省略此参数且领先的行不存在,则结果通常为 NULL。lead()
函数返回的是从当前行向后数n
行的expr
值。
示例:
假设有一个名为 sales
的表,其中包含以下数据:
+----+-------+------+
| id | month | sale |
+----+-------+------+
| 1 | Jan | 100 |
| 2 | Feb | 150 |
| 3 | Mar | 110 |
| 4 | Apr | 140 |
| 5 | May | 130 |
+----+-------+------+
如果你想比较每个月与前一个月的销售额,你可以使用 lag()
函数:
SELECT month, sale, lag(sale, 1, 0) OVER (ORDER BY month) AS prev_month_sale
FROM sales;
此查询将返回:
+-------+------+----------------+
| month | sale | prev_month_sale|
+-------+------+----------------+
| Jan | 100 | 0 |
| Feb | 150 | 100 |
| Mar | 110 | 150 |
| Apr | 140 | 110 |
| May | 130 | 140 |
+-------+------+----------------+
在这个例子中,lag(sale, 1, 0)
返回前一个月的销售额,如果前一个月不存在(如在 “Jan” 行中),则返回默认值 0。