首页 > 解决方案 > 在 SQL Server Query 中的 Join 操作期间避免重复

问题描述

我有几个日期表,如下所示

Date1(存储每个型号的折扣日期)

Year    Model   DiscountDate
2018    99L263  1/1/2017
2018    99L263  1/8/2018
2018    99L263  5/24/2018

Date2(存储每个模型的价格日期)

Year    Model   PriceDate
2018    99L263  1/1/2017
2018    99L263  1/8/2018
2018    99L263  3/1/2018

我正在尝试查找每种型号的所有折扣和价格日期。它导致笛卡尔积。

 SELECT D1.Year
    ,D1.Model
    ,D1.DiscountDate
    ,D2.PriceDate
FROM Date1 D1
INNER JOIN Date2 D2 ON D1.Year = D2.Year
    AND D1.Model = D2.Model

我得到这样的输出

Year    Model   DiscountDate    PriceDate
2018    99L263  1/1/2017    1/1/2017
2018    99L263  1/1/2017    1/8/2018
2018    99L263  1/1/2017    3/1/2018
2018    99L263  1/8/2018    1/1/2017
2018    99L263  1/8/2018    1/8/2018
2018    99L263  1/8/2018    3/1/2018
2018    99L263  5/24/2018   1/1/2017
2018    99L263  5/24/2018   1/8/2018
2018    99L263  5/24/2018   3/1/2018

我的预期输出是

Year    Model   DiscountDate    PriceDate
2018    99L263  1/1/2017    1/1/2017
2018    99L263  1/8/2018    1/8/2018
2018    99L263  5/24/2018   3/1/2018

我没有在加入条件中包含折扣日期,因为我无法加入日期,因为它可能彼此匹配,也可能不匹配。

标签: sqlsql-serversql-server-2008sql-server-2012sql-server-2008-r2

解决方案


with cte1 as
(Select *, Row_Number() over (partition by year, model order by DiscountDate) as ranking from date1)
, cte2 as
(Select *, Row_Number() over (partition by year, model order by pricedate) as ranking from date2)
 SELECT D1.Year
    ,D1.Model
    ,D1.DiscountDate
    ,D2.PriceDate
FROM cte1 D1
INNER JOIN cte2 D2 ON D1.Year = D2.Year
    AND D1.Model = D2.Model AND D1.ranking = D2.ranking

推荐阅读