使用框架窗口计算滞后与超前值
将 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_statusNTH_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 反馈 — 无需本地设置。
此课程中的所有课时
- 窗口框架子句:ROWS 与 RANGE
- 使用框架窗口计算滞后与超前值
- 使用 NTILE 和 Cume_Dist 分桶
- 真实场景的报表模式