SQL Server:从左联接返回一个匹配项(使用month()函数)

SQL Server:从左联接返回一个匹配项(使用month()函数),sql,sql-server,join,Sql,Sql Server,Join,我试图根据多个条件将两个表连接在一起:策略编号、事务类型、日期年份、日期月份 大多数策略都可以与此代码配合使用,但也有一些策略将具有多行数据,这些数据将满足联接条件,因此会为select语句返回重复的行 没有最好的方法来选择返回哪一个匹配(最早的日期、第一个匹配等),所以我只关心代码只返回一行数据(没有重复) 非常感谢您的任何建议/帮助 select a.POLICY_NUMBER, a.POLICY_TRANSACTION_TYPE, a.POLICY_START_DATE, b.COMMIS

我试图根据多个条件将两个表连接在一起:策略编号、事务类型、日期年份、日期月份

大多数策略都可以与此代码配合使用,但也有一些策略将具有多行数据,这些数据将满足联接条件,因此会为select语句返回重复的行

没有最好的方法来选择返回哪一个匹配(最早的日期、第一个匹配等),所以我只关心代码只返回一行数据(没有重复)

非常感谢您的任何建议/帮助

select
a.POLICY_NUMBER,
a.POLICY_TRANSACTION_TYPE,
a.POLICY_START_DATE,
b.COMMISSION_RATE,
from Table_1 as a
left join Table_2 as b
on
    a.POLICY_NUMBER = b.POLICY_NUMBER
    and a.POLICY_TRANSACTION_TYPE = b.TRANSACTION_TYPE
    and year(a.POLICY_START_DATE) = year(b.EFFECTIVE_DATE)
    and month(a.POLICY_START_DATE) = month(b.EFFECTIVE_DATE)
编辑

样本表1

POLICY_NUMBER  POLICY_TRANSACTION_TYPE  POLICY_YEAR_START_DATE
1              REN                      1/1/2016
1              MTA                      15/1/2016
样本表2

POLICY_NUMBER  TRANSACTION_TYPE  EFFECTIVE_DATE  COMMISSION_RATE
1              REN               1/1/2016        0.3
1              MTA               14/1/2016       0.1
1              MTA               16/1/2016       -0.1
所以原始代码会返回这个

POLICY_NUMBER  POLICY_TRANSACTION_TYPE  POLICY_YEAR_START_DATE COMMISSION_RATE
1              REN                      1/1/2016               0.3
1              MTA                      15/1/2016              0.1
1              MTA                      15/1/2016              -0.1

我只想返回MTA的其中一行,不管是0.1佣金率还是-0.1佣金率,我不介意。

你的问题有点模糊,没有样本数据和结果。让我假设重复项来自
表2
。您可以使用
行数()
任意选择一个:


你的问题有点模糊,没有样本数据和结果。让我假设重复项来自
表2
。您可以使用
行数()
任意选择一个:


用你正在使用的数据库标记你的问题。可能一个distinct将删除重复项?用你正在使用的数据库标记你的问题。可能一个distinct将删除重复项?
from Table_1 a left join
     (select b.*,
             row_number() over (partition by POLICY_NUMBER, TRANSACTION_TYPE, year(EFFECTIVE_DATE), month(EFFECTIVE_DATE)
                                order by TRANSACTION_TYPE -- this will be an arbitrary ordering
                               ) as seqnum
      from Table_2 b
     ) b
     on a.POLICY_NUMBER = b.POLICY_NUMBER and
        a.POLICY_TRANSACTION_TYPE = b.TRANSACTION_TYPE and
        year(a.POLICY_START_DATE) = year(b.EFFECTIVE_DATE) and
        month(a.POLICY_START_DATE) = month(b.EFFECTIVE_DATE)
select a.POLICY_NUMBER,
       a.POLICY_TRANSACTION_TYPE,
       a.POLICY_START_DATE,
       MAX(b.COMMISSION_RATE)
from Table_1 as a
left join Table_2 as b
    on a.POLICY_NUMBER = b.POLICY_NUMBER and
       a.POLICY_TRANSACTION_TYPE = b.TRANSACTION_TYPE and
       year(a.POLICY_START_DATE) = year(b.EFFECTIVE_DATE) and
       month(a.POLICY_START_DATE) = month(b.EFFECTIVE_DATE)

group by a.POLICY_NUMBER,
         a.POLICY_TRANSACTION_TYPE,
         a.POLICY_START_DATE