Возвращаемая строка для каждого ключа на основе приоритета в SQL Oracle

#sql #oracle #greatest-n-per-group

Вопрос:

У меня есть данные, как показано ниже. Некоторые элементы имеют более одного идентификатора типа. Мне нужно выбрать только один из каждого идентификатора.

Мое условие состоит в том, что

  • если существует (введите идентификатор элемента == 1), выберите только эту строку;
  • если не существует, идентификатор типа равен 1, проверьте, существует ли (идентификатор типа элемента == 2) выберите эту строку;
  • если не существует, введите id 2, проверьте, существует ли (введите id элемента == 3), выберите эту строку;

Мне не нужны данные, что идентификатор типа отличается от 1,2,3

ID Имя идентификатор типа
23 xx 1
24 yy 1
24 yy 2
24 yy 3
25 zz 2
26 qq 2
26 qq 3
27 ww нулевой
28 тт 4
28 р-р 5

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

ID Имя идентификатор типа
23 xx 1
24 yy 1
25 zz 2
26 qq 2

Комментарии:

1. Что означает «предмет»? Является ли это синонимом слова «идентификатор»?

Ответ №1:

Вы можете использовать row_number() :

 select t.*
from (select t.*,
             row_number() over (partition by id order by type_id) as seqnum
      from t
      where type_id in (1, 2, 3)
     ) t
where seqnum = 1;
 

Примечание: При этом используется тот факт, что типы, которые вы ищете, упорядочены. Если они произвольны, то вам может понадобиться case выражение в order by . Например, если вы хотели, чтобы приоритет был равен 2, 1, 3:

 order by (case type_id when 2 then 1 when 1 then 2 when 3 then 3 end)
 

Комментарии:

1. Спасибо @Gordon 🙂

Ответ №2:

 select id,
       min(name) keep (dense_rank first order by type_id) as name,
       min(type_id) as type_id
from   table_name
where  type_id in (1, 2, 3)
group  by id
;