0Pricing
SQL Academy · 课时

LAG、LEAD 与时间序列模式

使用 LAG 和 LEAD 将每行与其前一行或后一行进行比较,并构建逐期差值。

LAG、LEAD 与时间序列模式 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

LAG 与 LEAD:向前回看或查看后续

这两个函数可以访问窗口中的相邻行:

  • LAG(col, n, default) — 当前行之前第 n 行的值
  • LEAD(col, n, default) — 当前行之后第 n 行的值

上一行

比较同一用户的每个订单与上一个订单:

SELECT id, user_id, created_at, total,
       LAG(total) OVER (
         PARTITION BY user_id ORDER BY created_at
       ) AS prev_total
FROM orders;

日环比差值

与前一天的差值:

SELECT day, revenue,
       revenue - LAG(revenue) OVER (ORDER BY day) AS delta
FROM daily_revenue
ORDER BY day;

同比

在按月排列的序列上使用偏移量为 12 的 LAG:

SELECT month, revenue,
       LAG(revenue, 12) OVER (ORDER BY month) AS prev_year_revenue,
       revenue / NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) - 1 AS yoy
FROM monthly_revenue;

检测缺口

查找缺少数据的日期:

WITH d AS (
  SELECT day, LAG(day) OVER (ORDER BY day) AS prev_day FROM daily_signups
)
SELECT day, prev_day, day - prev_day AS gap_days
FROM d
WHERE day - prev_day > 1;

会话划分

当间隔超过阈值时,将行分组为不同会话:

WITH gaps AS (
  SELECT user_id, ts,
         CASE WHEN ts - LAG(ts) OVER (PARTITION BY user_id ORDER BY ts)
                 > INTERVAL '30 min'
              THEN 1 ELSE 0 END AS new_session
  FROM events
)
SELECT user_id, ts,
       SUM(new_session) OVER (PARTITION BY user_id ORDER BY ts) AS session_id
FROM gaps;

组中的第一项和最后一项

FIRST_VALUE 和 LAST_VALUE 会获取窗口的边界值:

SELECT id, total,
       FIRST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at) AS first_order,
       LAST_VALUE(total)  OVER (PARTITION BY user_id ORDER BY created_at
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_order
FROM orders;
-- LAST_VALUE needs the explicit frame, otherwise default frame ends at current row.

NTH_VALUE

选取分区中的第 N 个值:

SELECT id,
       NTH_VALUE(total, 2) OVER (
         PARTITION BY user_id ORDER BY total DESC
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
       ) AS second_largest
FROM orders;

时间序列默认值

LAG 的第三个参数表示不存在上一行时使用的默认值:

SELECT day, revenue,
       revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;
-- delta on first day = revenue itself (vs NULL)

等价的自连接

您可以使用自连接实现 LAG,但这样会更慢,也更难读。请始终优先使用窗口函数。

性能

窗口函数只遍历一次分区。瓶颈在于排序 — 在可行时为 ORDER BY 列建立索引。

回顾

LAG 和 LEAD 支持逐行比较。

  • 获取分区中的上一行或下一行
  • 计算差值、逐期变化和会话划分
  • 使用 FIRST_VALUE/LAST_VALUE 获取边界值

快速检查

如果要计算日环比收入变化,应使用哪个窗口函数?

常见问题解答

「LAG、LEAD 与时间序列模式」课时是免费的吗?

是的 — 「LAG、LEAD 与时间序列模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「LAG、LEAD 与时间序列模式」这节课中我会学到什么?

使用 LAG 和 LEAD 将每行与其前一行或后一行进行比较,并构建逐期差值。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「LAG、LEAD 与时间序列模式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. OVER、PARTITION BY、ORDER BY
  2. ROW_NUMBER、RANK、DENSE_RANK
  3. LAG、LEAD 与时间序列模式
  4. 累计总计与移动平均
← 返回 SQL Academy