Исключить строку с тем же идентификатором, но с другим значением вторичного столбца - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь исключить запись, если ID (PK) совпадает, но значение вторичного столбца отличается.

Итак, в моем примере ниже у меня есть два разных кода E03_Port и E12_PortfNotDef для одного ID, поэтому я хочу исключить запись E12_PortfNotDef, если коды от E01.. до E04.. срабатывает.

SELECT *
FROM (
  SELECT ID, Code,
    MAX(CASE WHEN Code = 'E01_Matured' THEN 1 Else NULL END) AS Matured,
    MAX(CASE WHEN Code = 'E02_Terminated' THEN 2 Else NULL END) AS Terminated,
    MAX(CASE WHEN Code = 'E03_Port' THEN '3' Else NULL END) AS Port,
    MAX(CASE WHEN Code = 'E04_Swap' THEN 4 Else NULL END) AS Swap,
    MAX(CASE WHEN Code = 'E12_PortfNotDef' THEN '12' Else NULL END) AS Port_Not_Def
  FROM EXCLUDED
  GROUP BY ID, Code
)
WHERE COALESCE(Matured, Terminated, Port, Swap Port_Not_Def) IS NOT NULL
AND ID = '120320AC'
ORDER BY ID;

Фактические результаты:

    ID              Code            Matured     Terminated   Port Swap  Port_Not_Def
    120320AC      E03_Port             3            
    120320AC      E12_PortfNotDef                                             12

Ожидаемые результаты:

    ID              Code           Matured   Terminated     Port    Swap    Port_Not_Def
    120320AC      E03_Port            3

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

В итоге я ограничил идентификаторы в предложении FROM, чтобы не показывать те, в которых код был E01-E04.

0 голосов
/ 08 мая 2019

Существует тривиальный способ применения оконной аналитической функции row_number():

SELECT *
 FROM (
       SELECT ID, Code,    
              MAX(CASE WHEN Code = 'E01_Matured' THEN 1 Else NULL END) AS Matured,
              MAX(CASE WHEN Code = 'E02_Terminated' THEN 2 Else NULL END) AS Terminated,
              MAX(CASE WHEN Code = 'E03_Port' THEN '3' Else NULL END) AS Port,
              MAX(CASE WHEN Code = 'E04_Swap' THEN 4 Else NULL END) AS Swap,
              MAX(CASE WHEN Code = 'E12_PortfNotDef' THEN '12' Else NULL END) AS Port_Not_Def,
              ROW_NUMBER() OVER (PARTITION BY Code ORDER BY ID, Code) AS RN     
         FROM EXCLUDED
        GROUP BY ID, Code)    
 WHERE COALESCE(Matured, Terminated, Port, Swap Port_Not_Def) IS NOT NULL
   AND ID = '120320AC'
   AND RN = 1
 ORDER BY ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...