SQL условное соединение Teradata - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь соединить следующие две таблицы T1 и T2 на T1.id = T2.id, T1.MonA = T2.MonB, так что

  1. Всякий раз, когда MonA = MonB (iow запись можно найти в обеих таблицах), выполнить обычное соединение. Это относится к установке для идентификатора A, MonA = MonB = 3
  2. Если запись MonB находится в таблице T2, но в таблице T1 нет одинаковой записи MonA, соединение должно взять из таблицы T1 строку где MonA является максимальным. В примерах таблиц это относится к обоим последним строкам.
  3. MonA от T1, которые не находятся в T2, должны игнорироваться

Условие T1.id = T2.id равно необходимое предварительное условие, поэтому это всегда должно быть правдой!

Table T1
ID            MonA     Data
A             2        BBB
A             3        CCC
B             4        DDD
B             5        EEE
B             11       EEE
Table T2
ID            MonB     Organ
A             3        Liver
B             5        Heart
B             7        Kidney

Вот как должен выглядеть результат

ID       MonA    MonB    Data       Organ
A        3       3       CCC        Liver
B        5       5       EEE        Heart
B        11      7       EEE        Kidney

Мне нужно, чтобы это было выполнено в Teradata SQL и, честно говоря, в настоящее время понятия не имею, как решить проблему. Спасибо за помощь!

РЕДАКТИРОВАТЬ: Может быть несколько записей с одинаковым идентификатором, MonA = MonB, но разные столбцы данных / орган, и я хочу, чтобы все они были в результирующей таблице.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Позволяет объединить t1 с t2 следующим образом

--gets all of the matching records by (id,mona) pairs from t1 with (id,monb) from t2
select a.id,a.mona,b.monb,a.data,b.organ
  from t1 a
  join t2 b
    on a.id=b.id
   and a.mona=b.monb
union all /*Here you want only from t2 not there in t1 by id*/
   select b.id,x.mona,b.monb,x.data,b.organ
     from t2 b
left join t1 a
       on a.id=b.id
      and a.mona=b.monb
left join (select row_number() over(partition by id order by mona desc) as rnk
                  ,id
                  ,mona
                  ,data
             from t1 
           )x
       on b.id=x.id
      and x.rnk=1 /*pick up only the largest values arranged by mona*/
    where a.mona is null /*Gets only the missing records from t2 which are not in t1*/
0 голосов
/ 03 февраля 2020

Это должно вернуть ожидаемый результат:

SELECT t1.id,t1.mona,t2.monb,t1.data,t2.organ
  FROM t1
  JOIN t2
    ON t1.id=t2.id
QUALIFY
   Row_Number() 
   Over (PARTITION BY t2.id, t2.organ 
                  -- prefer same entry in both tables
         ORDER BY CASE WHEN t1.mona = t2.monb THEN 1 ELSE 2 END
                  -- otherwise take max monA
                  ,t1.mona DESC -- ) = 1
...