跳到主要内容

简述前后函数 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)。

这两个函数在处理时间序列数据、计算移动平均值、检测趋势变化等方面非常有用。它们允许你在一行中查看其前后行的数据,从而更容易地进行比较和分析。