#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