跳转到主要内容
模块 13 · 第 4 课(共 4)课程中的52/57~12 min
模块课程(4/4)

班次:滞后和领先

班次:滞后和领先

在顺序数据和基于时间的数据中,您经常需要将当前行与前一天的行进行比较。在“标准”SQL 中,这样做需要非常危险(并且非常慢)的自连接。

LAG()(上一行)和 LEAD()(下一行)函数以极其敏捷和优雅的方式解决了这个问题。

展望过去与未来

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

在该示例中,每一行将方便地携带同一表产生的金额,向前移动一行(在时间上向后移动)。我们可以轻松减去 total_amount - LAG(...) 来计算差异或逐月百分比变化!

同样, LEAD() 将从当前行正下方的行中提取值。

锻炼#sql.m13.l4.e1
尝试:0加载中...

从“products”表中,提取“id”、“launched_on”、“price”并添加“prev_price”,即产品的“price”在逻辑上被视为“前一个”价格,按“launched_on”升序排列。

正在加载编辑器...
显示提示

使用 LAG(price) OVER(ORDER BYlaunched_on ASC)

3 次尝试后可用的解决方案

锻炼#sql.m13.l4.e2
尝试:0加载中...

您如何计算每个用户的评分跳跃?模拟一下:从“reviews”表中提取“customer_id”、“created_at”、“ rating”和“next_ rating”(同一客户随时间的下一次评论)。因此,按“customer_id”进行分区,按“created_at”进行排序,并使用正确的窗口函数来查看。

正在加载编辑器...
显示提示

LEAD() 与 OVER 中的 PARTITION BY 和 ORDER BY 一起使用。

3 次尝试后可用的解决方案