Описание случая водопада - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь написать оператор case, который возвращает единственное значение, как только он находит правильное значение из каждого оператора "WHEN". Как только он находит подходящее значение, запрос не должен пытаться оценить другие операторы.

SELECT
    DT1.COMPANY_ID
    , CASE
    WHEN DT1.RATING_NUMBER = 2 THEN DT1.UNIQUE_ENTRY_ID
    WHEN DT1.RATING_NUMBER = 1 THEN DT1.UNIQUE_ENTRY_ID
    WHEN DT1.RATING_NUMBER = 3 THEN DT1.UNIQUE_ENTRY_ID
     END AS UNIQUE_ENTRY_ID
FROM
    RATINGS_DATA DT1

ОБРАЗЕЦ ДАННЫХ

create table COMP_RESULTS (COMPANY_ID varchar2(20),RATING_NUMBER number, UNIQUE_ENTRY_ID varchar2(20));

insert into COMP_RESULTS values ('Org00001','1','ENTRY_C1_1');
insert into COMP_RESULTS values ('Org00001','2','ENTRY_C1_2');
insert into COMP_RESULTS values ('Org00001','3','ENTRY_C1_3');
insert into COMP_RESULTS values ('Org00002','2','ENTRY_C2_2');
insert into COMP_RESULTS values ('Org00002','3','ENTRY_C2_3');
insert into COMP_RESULTS values ('Org00003','3','ENTRY_C3_3');

За каждый день публикуются рейтинговые номера для каждой компании; иногда все, иногда не все). Если рейтинг равен 1, он создает соответствующий уникальный идентификатор. Если рейтинговое число равно 2, ID соответствующего кода освобождается. Если рейтинг «1» выпущен, запрос приносит ID компании и соответствующий UNIQUE_ENTRY_ID для него. это не должно беспокоить, глядя на второе утверждение «КОГДА». Если рейтинг «1» не существует, то он пытается 2, если ни один не существует, 3 и т. Д. И т. Д.

РЕЗУЛЬТАТЫ ОБРАЗЦА

Org00001    2   ENTRY_C1_1
Org00002    2   ENTRY_C2_2
Org00003    3   ENTRY_C3_3

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 16 января 2019

Выражение case останавливает оценку терминов, как только находит совпадение. Поэтому я думаю, что вы задаете не тот вопрос. Не похоже, что вы действительно хотите использовать выражение case.

Из ваших выборочных данных и результатов вы, кажется, хотите получить агрегат, используя first, что-то вроде:

select dt1.company_id,
  max(dt1.unique_entry_id)
    keep (dense_rank first order by dt1.rating_number) as unique_entry_id
from comp_results dt1
group by dt1.company_id;

COMPANY_ID           UNIQUE_ENTRY_ID     
-------------------- --------------------
Org00001             ENTRY_C1_1          
Org00002             ENTRY_C2_2          
Org00003             ENTRY_C3_3          

Это все равно оценивает каждую строку, но затем агрегирует и сохраняет только ту, которая имеет наименьший rating_number - который соответствует желаемому порядку приоритета.

дб <> скрипка

После вашего редактирования, если номера рейтинга не в числовом порядке, вы можете добавить выражение регистра обратно в предложение order by, чтобы указать желаемый порядок:

select dt1.company_id,
  max(dt1.unique_entry_id) keep (dense_rank first
    order by case dt1.rating_number
             when 2 then 1
             when 1 then 2
             when 3 then 3
      end) as unique_entry_id
from comp_results dt1
group by dt1.company_id;

Обновлен дБ <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...