简述前后函数 lag(expr,n,defval)、lead(expr,n,defval) ?
参考答案:
lag(expr, n, defval)
和 lead(expr, n, defval)
是 SQL 窗口函数中的两个函数,它们主要用于处理有序数据集中的行与行之间的关系。这两个函数常用于分析时间序列数据、排名数据或其他有顺序的数据集。
1. lag(expr, n, defval)
lag
函数返回指定偏移量 n
之前的行的 expr
的值。如果偏移量超出了窗口的范围,则返回 defval
(默认值)。如果没有提供 defval
,则当超出范围时返回 NULL
。
- expr: 要获取的列或表达式的值。
- n: 要回溯的行数。默认为 1。
- defval: 当没有足够的前置行时返回的默认值。
示例:
假设有一个名为 sales
的表,其中包含了每日的销售数据:
SELECT date, sales, lag(sales, 1, 0) OVER (ORDER BY date) as prev_day_sales
FROM sales;
这条 SQL 语句将返回每一天的销售数据以及前一天的销售数据(如果前一天没有数据,则返回 0)。
2. lead(expr, n, defval)
与 lag
相反,lead
函数返回指定偏移量 n
之后的行的 expr
的值。如果偏移量超出了窗口的范围,则返回 defval
(默认值)。如果没有提供 defval
,则当超出范围时返回 NULL
。
- expr: 要获取的列或表达式的值。
- n: 要前瞻的行数。默认为 1。
- defval: 当没有足够的后置行时返回的默认值。
示例:
使用相同的 sales
表,你可以使用 lead
函数来获取每一天的销售数据以及后一天的销售数据:
SELECT date, sales, lead(sales, 1, 0) OVER (ORDER BY date) as next_day_sales
FROM sales;
这条 SQL 语句将返回每一天的销售数据以及后一天的销售数据(如果后一天没有数据,则返回 0)。
这两个函数在处理时间序列数据、计算移动平均值、检测趋势变化等方面非常有用。它们允许你在一行中查看其前后行的数据,从而更容易地进行比较和分析。