Как выбрать конкретное значение c из таблицы и избежать дубликатов? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть две таблицы:

MainTable

id AccountNum  status

1  11001   active
2  11002   active
3  11003   active
4  11004   active

AddTable

id  date     description
1  01.2020   ACCOUNT.SET
1  02.2020   ACCOUNT.CHANGE
1  03.2020   ACCOUNT.REMOVE
2  04.2020   ACCOUNT.SET
2  05.2020   ACCOUNT.CHANGE
3  08.2020   ACCOUNT.SET
4  05.2020   ACCOUNT.SET
4  09.2020   ACCOUNT.REMOVE

Мне нужно получить такой результат:

EffectiveFrom - это дата, когда учетная запись была установлена, EffectiveTo - это дата, когда учетная запись была удалена

id AccountNum EffectiveFrom  EffectiveTo
1  11001       01.2020         03.2020
2  11002       04.2020          null 
3  11003       08.2020          null
4  11004       05.2020         09.2020

Проблема заключается в том, что после присоединения к AddTable я получаю дубликаты, но мне нужно только одна строка на каждый идентификатор и только даты, когда описание в ACCOUNT.SET, ACCOUNT.REMOVE.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Используйте PIVOT и LEFT OUTER JOIN:

SELECT m.id,
       a.EffectiveFrom,
       a.EffectiveTo
FROM   MainTable m
       LEFT OUTER JOIN
       (
         SELECT *
         FROM   AddTable
         PIVOT( MAX( dt ) FOR description IN (
           'ACCOUNT.SET' AS EffectiveFrom,
           'ACCOUNT.REMOVE' AS EffectiveTo
         ) )
       ) a
       ON ( a.id = m.id )
ORDER BY m.id

Так что для ваших тестовых данных:

CREATE TABLE MainTable ( id, AccountNum, status ) AS
SELECT 1, 11001, 'active' FROM DUAL UNION ALL
SELECT 2, 11002, 'active' FROM DUAL UNION ALL
SELECT 3, 11003, 'active' FROM DUAL UNION ALL
SELECT 4, 11004, 'active' FROM DUAL;

CREATE TABLE AddTable ( id, dt, description ) AS
SELECT 1, DATE '2020-01-01', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 1, DATE '2020-01-02', 'ACCOUNT.CHANGE' FROM DUAL UNION ALL
SELECT 1, DATE '2020-01-03', 'ACCOUNT.REMOVE' FROM DUAL UNION ALL
SELECT 2, DATE '2020-01-04', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 2, DATE '2020-01-05', 'ACCOUNT.CHANGE' FROM DUAL UNION ALL
SELECT 3, DATE '2020-01-08', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 4, DATE '2020-01-05', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 4, DATE '2020-01-09', 'ACCOUNT.REMOVE' FROM DUAL;

Это выводит:

ID | EFFECTIVEFROM | EFFECTIVETO
-: | :------------ | :----------
 1 | 01-JAN-20     | 03-JAN-20  
 2 | 04-JAN-20     | <em>null</em>       
 3 | 08-JAN-20     | <em>null</em>       
 4 | 05-JAN-20     | 09-JAN-20  

дБ <> скрипка здесь

0 голосов
/ 10 февраля 2020

Вы ищете left join?

  select m.id         as id,
         m.AccountNum as AccountNum,
         a.date       as EffectiveFrom,
         b.date       as EffectiveTo
    from MainTable m left join
         AddTable a on (a.id = m.id and a.description = 'ACCOUNT.SET') left join
         AddTable b on (b.id = m.id and b.description = 'ACCOUNT.REMOVE') 
order by m.AccountNum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...