SQL Server: возвращает одно совпадение из левого соединения (с помощью функции month ())

#sql #sql-server #join

#sql #sql-сервер #Присоединиться

Вопрос:

Я пытаюсь объединить две таблицы на основе нескольких критериев: номер политики, тип транзакции, год даты, месяц даты

Большинство политик будут нормально работать с этим кодом, но есть несколько, которые будут иметь несколько строк данных, которые удовлетворяли бы критериям объединения, поэтому возвращают повторяющиеся строки для моего оператора 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, я не возражаю.

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

2. Вероятно, distinct удалит дубликаты?

Ответ №1:

Ваш вопрос немного расплывчатый, без примеров данных и результатов. Позвольте мне предположить, что дубликаты поступают из table2 . Вы можете произвольно выбрать одно из них, используя row_number() :

 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)
  

Ответ №2:

 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