Oracle. Вернуть правильную запись на основе значений полей - PullRequest
1 голос
/ 02 февраля 2020

Из предыдущего поста кто-то уже помог и помог мне создать этот выбор, который возвращает 1 запись по макс. festpae_id

SELECT *
  FROM
  (
    SELECT discount, osp_id, sero_id, estpt_id, 
           ROW_NUMBER() OVER 
          (PARTITION BY osp_id, sero_id, estpt_id ORDER BY festpae_id DESC) as festpae_id 
      FROM database1 data1
      JOIN database2 data2 ON data2.id = data1.attr_id
     WHERE data1.interest_rate = 1 
       AND data1.ordet_id = data2.id
       AND data1.objt_attr_id = data2.objt_attr_id 
   )
  WHERE festpae_id = 1

Записи:

DISCOUNT     OSP_ID    SERO_ID   ESTPT_ID FESTPAE_ID   VALUE
---------- ---------- ---------- ---------- ---------- ----------
      50     619356    3931831       2144    NULL       0
      40     619356    3931831       2144    NULL       1
      30     619356    3931831       2144    2000743    0
      15     619356    3931831       2144    2000744    1

Итак, из этого выбора я получу эту запись

DISCOUNT     OSP_ID    SERO_ID   ESTPT_ID FESTPAE_ID   VALUE
---------- ---------- ---------- ---------- ---------- ----------
      50     619356    3931831       2144    NULL       0

Пока у меня больше условия должны быть проверены, и мой разум взорван, плюс мои oracle знания недостаточно хороши.

Так что мне нужно? Как видите, есть 2 столбца с именами value и festpae_id. Они должны быть приняты в состояние.

  1. Если записи существуют там, где festpae_id is NULL, тогда он должен проверить все записи, где festpae_id is NULL и value = 1, и вернуть запись, если существует.
  2. Если нет записей, где festpae_id is null, затем select должен вернуть запись с MAX(festpae_id) (в этом случае используется ROW_NUMBER ()) и где value = 1.
  3. В других случаях select не должен возвращать ничего.

Я знаю, что это можно сделать через DECODE(), но тогда мне нужно скопировать и вставить код, который не в порядке. Может быть, кто-то из вас может быть так добр и поделиться своими мыслями о решении? Работаем над этим не менее 5 часов и не можем найти способ, как это сделать.

PS Этот выбор используется в таблице представлений как LEFT OUTER JOIN.

1 Ответ

3 голосов
/ 02 февраля 2020

Просто настройте order by и добавьте value = 1 к WHERE:

      (PARTITION BY osp_id, sero_id, estpt_id
       ORDER BY (CASE WHEN festpae_id IS NULL
                      THEN 1 ELSE 2
                 END),
                festpae_id DESC
      ) as festpae_id 

И:

WHERE data1.interest_rate AND value = 1

Вы также можете добавить условие WHERE и упростить ORDER BY до ORDER BY testpae_id DESC NULLS FIRST.

...