如何编写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
相关产品推荐
相关产品推荐

