You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明

  1. 先对两张表做左连接,关联条件为相同user_id且Event2的事件时间晚于Event1,拿到所有符合时间先后顺序的候选匹配结果
  2. 用窗口函数对每一行Event1数据分组,对匹配到的Event2数据按时间升序排序,时间最近的Event2行号为1
  3. 最后筛选行号为1的匹配结果,同时保留行号为空的记录(即没有匹配到后续Event2的Event1数据),完全符合左连接的预期结果

注:如果Event1表有独立主键,PARTITION BY可以直接替换为Event1的主键字段,分组逻辑会更严谨。

内容的提问来源于stack exchange,提问作者pvash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:57:03