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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:14