0Pricing
SQL Academy · 课时

使用框架窗口计算滞后与超前值

将 LAG/LEAD 与框架窗口结合起来,计算期间差值并检测时间序列中的间隔

使用框架窗口计算滞后与超前值 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

LAG/LEAD 回顾

LAG(col, n) 返回窗口中当前行之前 n 行的值。LEAD(col, n) 查看后面的行。

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

带默认值的 LAG

第三个参数是在不存在相邻行时使用的默认值:

LAG(revenue, 1, 0) OVER (ORDER BY day)
-- Returns 0 instead of NULL for the very first row.

计算差值

日环比变化:

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

多步 LAG

与 N 天前进行比较——适用于周环比和同比:

LAG(revenue, 7) OVER (ORDER BY day)   -- 7 days ago
LAG(revenue, 365) OVER (ORDER BY day) -- 1 year ago

使用 LEAD 预测后续时段

“下一个事件是什么?”模式:

SELECT id, ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) AS next_ts,
       LEAD(ts) OVER (PARTITION BY user_id ORDER BY ts) - ts AS gap_to_next
FROM events;

每用户模式

LAG/LEAD 遵循 PARTITION BY:

SELECT user_id, ts, action,
       LAG(action) OVER (PARTITION BY user_id ORDER BY ts) AS prev_action
FROM events;
-- prev_action is the user's previous event, not globally.

检测状态变化

将 LAG 与 CASE 组合:

SELECT id, status,
  CASE WHEN status <> LAG(status) OVER (ORDER BY ts) THEN 'changed' ELSE 'same' END
FROM orders;

FIRST_VALUE / LAST_VALUE

框架中的第一个值或最后一个值:

FIRST_VALUE(status) OVER (PARTITION BY order_id ORDER BY ts) AS first_status
-- The status when the order was first seen.

LAST_VALUE(status) OVER (
  PARTITION BY order_id ORDER BY ts
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS final_status

NTH_VALUE

有序窗口中的第 N 个值:

NTH_VALUE(revenue, 3) OVER (
  ORDER BY revenue DESC
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
-- Third-highest revenue value.

分组框架函数

将 LAG 与 PARTITION BY 组合,以获取分组后的相邻行:

SELECT user_id, ts, page,
       LAG(page) OVER (PARTITION BY user_id ORDER BY ts) AS prev_page,
       LEAD(page) OVER (PARTITION BY user_id ORDER BY ts) AS next_page
FROM page_views;

性能

窗口函数会对每个分区排序一次。分区较大时,请为 (PARTITION BY, ORDER BY) 列建立索引。

回顾

LAG/LEAD 可以低成本地进行逐行比较。

  • 默认值可以避免 NULL
  • 与 CASE 组合以检测状态变化
  • FIRST_VALUE/LAST_VALUE/NTH_VALUE 补全了这一组函数

快速检查

您希望每行都包含到用户下一事件之间的间隔(秒)。应该使用哪个函数?

常见问题解答

「使用框架窗口计算滞后与超前值」课时是免费的吗?

是的 — 「使用框架窗口计算滞后与超前值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「使用框架窗口计算滞后与超前值」这节课中我会学到什么?

将 LAG/LEAD 与框架窗口结合起来,计算期间差值并检测时间序列中的间隔 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

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

「使用框架窗口计算滞后与超前值」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 窗口框架子句:ROWS 与 RANGE
  2. 使用框架窗口计算滞后与超前值
  3. 使用 NTILE 和 Cume_Dist 分桶
  4. 真实场景的报表模式
← 返回 SQL Academy