Вы можете использовать аналитическую функцию 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)