SQL多日期匹配连接问题:如何实现优先同日期再次日匹配?
解决方案
首先修正原SQL的两个核心问题:
- 遗漏了币种匹配条件,这会导致跨币种的错误关联
- OR连接的条件会返回多条匹配记录,需要筛选出优先级最高的唯一结果
方法一:用窗口函数筛选最优匹配
通过ROW_NUMBER()给每个ID的匹配记录按优先级(同天>次日)排序,仅保留排名第一的记录:
WITH matched_data AS ( SELECT t1.*, t2.*, -- 按匹配优先级排序:同天匹配排1,次日匹配排2 ROW_NUMBER() OVER ( PARTITION BY t1.ID ORDER BY CASE WHEN t1.DateA = t2.DateB THEN 1 WHEN t1.DateA = DATEADD(day, -1, t2.DateB) THEN 2 ELSE 3 END ) AS match_rank FROM tableA t1 LEFT JOIN tableB t2 ON t1.CurrencyA = t2.CurrencyB -- 补上币种匹配条件 AND ( t1.DateA = t2.DateB -- 优先同天匹配 OR t1.DateA = DATEADD(day, -1, t2.DateB) -- 次次日匹配 ) ) SELECT * FROM matched_data WHERE match_rank = 1 -- 仅保留优先级最高的匹配
方法二:分步匹配(先同天,再补次日)
先提取同天匹配的记录,对未匹配到的ID,再匹配次日记录,最后合并结果:
-- 先取同天匹配的记录 SELECT t1.*, t2.* FROM tableA t1 JOIN tableB t2 ON t1.CurrencyA = t2.CurrencyB AND t1.DateA = t2.DateB UNION ALL -- 再取同天无匹配、但能匹配次日的记录 SELECT t1.*, t2.* FROM tableA t1 LEFT JOIN tableB t2_same ON t1.CurrencyA = t2_same.CurrencyB AND t1.DateA = t2_same.DateB JOIN tableB t2 ON t1.CurrencyA = t2.CurrencyB AND t1.DateA = DATEADD(day, -1, t2.DateB) WHERE t2_same.DateB IS NULL -- 确保同天无匹配
关键说明
- 必须添加
CurrencyA = CurrencyB的匹配条件,否则会出现不同币种的错误关联 - 两种方法都能保证每个ID仅返回一条记录,优先保留同天匹配结果;若同天无匹配,则返回次日匹配结果
内容的提问来源于stack exchange,提问作者Gys---p
相关产品推荐
相关产品推荐

