LATERAL JOIN:在时间轴中逐行追溯状态变迁
利用 PostgreSQL 的 LATERAL 子查询,在对每行记录进行子查询时引用外层列,实现“针对当前行查询其前后状态”的闭环分析。 · 难度:入门 · +10XP
LATERAL JOIN:在时间轴中逐行追溯状态变迁
传统 JOIN 无法在子查询中动态引用外层当前行的字段值。LATERAL 允许子查询对外层每行执行一次,非常适合做“窗口内前一条记录”或“每个用户最近 3 笔交易”等需求。本教程以用户操作日志为例,用 LATERAL 找出每次状态变更前的最后一条日志。
-- 查找每个用户每次状态变更前 5 分钟内的最后一条日志
SELECT u.user_id, u.event_time, u.status,
prev.event_time AS prev_time, prev.status AS prev_status
FROM user_log u
LEFT JOIN LATERAL (
SELECT event_time, status
FROM user_log
WHERE user_id = u.user_id
AND event_time < u.event_time
AND event_time >= u.event_time - INTERVAL '5 minutes'
ORDER BY event_time DESC
LIMIT 1
) prev ON true
ORDER BY u.user_id, u.event_time;