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

如何编写SQL实现两表合并并基于最新ExecDate获取唯一邮箱

问题分析与修正后的SQL写法

原SQL存在的核心问题:

  • CTE cte_2 中的 ORDER BY ExecDate 不会对后续查询产生持久的排序效果,CTE本身不会保留排序状态,后续的DISTINCT操作无法关联到“最新ExecDate”的逻辑。
  • DISTINCT(Requester_Emails) 仅对邮箱字段去重,但无法保证取到对应最新ExecDate的Region,若同一邮箱存在多条不同Region或不同时间的记录,结果会不符合需求。

修正后的SQL语句

WITH combined_tickets AS (
    SELECT
        Requester_Emails,
        Region,
        ExecDate
    FROM monthly_tickets
    WHERE Region LIKE 'new%' AND Region IS NOT NULL
    UNION ALL  -- 若两张表无完全重复记录,用UNION ALL比UNION性能更优
    SELECT
        Requester_Emails,
        Region,
        ExecDate
    FROM weekly_tickets
    WHERE Region LIKE 'new%' AND Region IS NOT NULL
),
ranked_tickets AS (
    SELECT
        Requester_Emails,
        Region,
        ExecDate,
        -- 按邮箱分组,按执行日期倒序排名,最新记录排第1位
        ROW_NUMBER() OVER (PARTITION BY Requester_Emails ORDER BY ExecDate DESC) AS rn
    FROM combined_tickets
)
SELECT
    Requester_Emails,
    Region
FROM ranked_tickets
WHERE rn = 1;  -- 仅保留每个邮箱对应的最新记录

关键说明

  • 替换UNION为UNION ALL:如果两张表不存在完全重复的记录(同一Requester_Emails、Region、ExecDate),UNION ALL无需做去重校验,执行效率更高;若存在重复场景,可保留UNION。
  • 用窗口函数实现“取最新记录”:通过PARTITION BY Requester_Emails对每个邮箱单独分组,ORDER BY ExecDate DESC让最新的记录排在组内第一位,最后筛选rn=1即可精准拿到每个邮箱对应最新日期的Region。
  • 移除无效排序:原CTE中的排序操作不影响最终结果,窗口函数内的排序才是实现需求逻辑的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:26:05