Amazon Redshift 基于用户ID与最近相邻日期实现两表左连接问题
解决方案
Redshift 不支持在 JOIN 条件中使用引用外层表字段的关联子查询,因此你原本的写法会触发报错,可以改用窗口函数方案实现需求,兼容所有Redshift版本,性能也更优:
WITH matched_candidates AS ( SELECT e1.timestamp AS timestamp_event_1, e1.user_id, e1.n_trigg, e2.timestamp AS timestamp_event_2, e2.product_id, -- 按Event1唯一行分组,按Event2时间升序排序打行号 ROW_NUMBER() OVER ( PARTITION BY e1.user_id, e1.timestamp, e1.n_trigg ORDER BY e2.timestamp ASC ) AS rn FROM Event_1 e1 LEFT JOIN Event_2 e2 ON e1.user_id = e2.user_id AND e2.timestamp > e1.timestamp ) SELECT timestamp_event_1, user_id, n_trigg, timestamp_event_2, product_id FROM matched_candidates WHERE rn = 1 OR rn IS NULL;
逻辑说明
- 先对两张表做左连接,关联条件为相同
user_id且Event2的事件时间晚于Event1,拿到所有符合时间先后顺序的候选匹配结果 - 用窗口函数对每一行
Event1数据分组,对匹配到的Event2数据按时间升序排序,时间最近的Event2行号为1 - 最后筛选行号为1的匹配结果,同时保留行号为空的记录(即没有匹配到后续
Event2的Event1数据),完全符合左连接的预期结果
注:如果
Event1表有独立主键,PARTITION BY可以直接替换为Event1的主键字段,分组逻辑会更严谨。
内容的提问来源于stack exchange,提问作者pvash
相关产品推荐
相关产品推荐

