Условно где? - PullRequest
       16

Условно где?

0 голосов
/ 28 февраля 2019

Используя следующую таблицу.Я пытаюсь получить Party_ID.У меня будут только NEW_ORG_ID и ORIGINAL_ID.

Используя NEW_ORG_ID, я хочу получить PARTY_ID с MAX (USR_CRTE_TS) , если ORIGINAL_ID также не совпадает.Затем я хочу, чтобы PARTY_ID совпадал с NEW_ORG_ID и ORIGINAL_ID.

PARTY_ID          |DIRS_ID  |SUPPLIER_ID|ORIGINAL_ID|TRIANGLE_ID|NEW_ORG_ID|USR_CRTE_TS        |
------------------|---------|-----------|-----------|-----------|----------|-------------------|
5385606962        |476800490|5385606962 |NULL       |NULL       |69214683  |2018-09-27 04:56:13|
69214683          |476800490|NULL       |2740793553 |NULL       |69214683  |2018-09-27 04:54:15|

Я попробовал следующее.Имейте в виду, что я жестко закодировал NEW_ORG_ID и ORIGINAL_ID только для этого примера.В реальном мире примеры NEW_ORG_ID и ORIGINAL_ID предоставляются другой частью запроса.

    SELECT DISTINCT PARTY_ID 
FROM UNIQUE_IDS UNQ 
WHERE   
( 
        CASE
            WHEN ( 
                    SELECT ts.PARTY_ID
                    FROM UNIQUE_IDS ts 
                    WHERE (ts.NEW_ORG_ID = '69214683' AND ts.ORIGINAL_ID = '2740793553') 
                 ) IS NOT NULL
            THEN 
                (
                    SELECT ts.PARTY_ID 
                    FROM UNIQUE_IDS ts 
                    WHERE (ts.NEW_ORG_ID = '69214683' AND ts.ORIGINAL_ID = '2740793553') 
                )
            ELSE 
                (
                    SELECT ts.PARTY_ID
                    FROM UNIQUE_IDS ts 
                    WHERE ts.NEW_ORG_ID = '69214683'
                    AND ts.USR_CRTE_TS = (  
                                            SELECT MAX(ts.USR_CRTE_TS) 
                                            FROM UNIQUE_IDS ts 
                                            WHERE ts.NEW_ORG_ID = '69214683'
                                        )--xref.SBL_GLOB_CSTMR_ID)
                )
        END
) = UNQ.NEW_ORG_ID 

;

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать аналитическую функцию ROW_NUMBER(), чтобы получить «лучшее» совпадение (сначала ORIGINAL_ID, а затем USR_CRTE_TS), помеченное номером 1, и отфильтровать по нему:

SELECT PARTY_ID
FROM   (
            SELECT  PARTY_ID,
                    USR_CRTE_TS,  
                    ROW_NUMBER() OVER (
                        PARTITION BY PARTY_ID 
                        ORDER BY     CASE ORIGINAL_ID 
                                         WHEN '2740793553' THEN 0 
                                         ELSE 1 
                                     END,
                                     USR_CRTE_TS DESC
                    ) RN
            FROM    UNIQUE_IDS
            WHERE   NEW_ORG_ID = '69214683'
        )
WHERE   RN = 1

Если USR_CRTE_TS может быть NULL, то добавьте еще одно условие в самом конце, чтобы оно соответствовало тому, что у вас было:

AND     (ORIGINAL_ID = '2740793553' OR USR_CRTE_TS IS NOT NULL)

Когда критерии выбраны в другом месте

Вы можете использовать предложение WITH для создания вашего запроса, слой за слоем.Итак, давайте предположим, что у вас уже есть рабочая логика для выбора двух «параметров», затем поместите это в предложение with следующим образом:

WITH CRIT(SEL_ORG_ID, SEL_ORIGINAL_ID) AS (
    SELECT '69214683', '2740793553' FROM DUAL -- this is just an example
)

... и затем продолжите запрос следующим образом:

), BASE AS (
    SELECT  UI.PARTY_ID,
            UI.USR_CRTE_TS,
            UI.ORIGINAL_ID,
            CRIT.SEL_ORIGINAL_ID,
            ROW_NUMBER() OVER (
                PARTITION BY UI.PARTY_ID 
                ORDER BY     CASE UI.ORIGINAL_ID 
                                 WHEN CRIT.SEL_ORIGINAL_ID THEN 0 
                                 ELSE 1 
                             END,
                             UI.USR_CRTE_TS DESC
            ) RN
    FROM    UNIQUE_IDS UI,
            CRIT
    WHERE   UI.NEW_ORG_ID = CRIT.SEL_NEW_ORG_ID
)
SELECT PARTY_ID
FROM   BASE
WHERE  RN = 1
AND    (ORIGINAL_ID = SEL_ORIGINAL_ID OR USR_CRTE_TS IS NOT NULL)
0 голосов
/ 28 февраля 2019

Я бы использовал row_number() с условным заказом:

select party_id 
  from (
    select party_id, 
           row_number() over (order by case when original_id = '2740793553' then 1 end, 
                                       usr_crte_ts desc) rn
      from unique_ids unq
      where new_org_id = '69214683')
  where rn = 1

Демо-версия dbfiddle

Если original_id совпадений, тогда строка имеет более высокий приоритет.Второй приоритет самый высокий usr_crte_ts.Наконец мы берем первый лучший ряд.

...