#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 | 2 | |
26 | 3 | |
27 | ww | нулевой |
28 | тт | 4 |
28 | р-р | 5 |
Ожидаемый результат
ID | Имя | идентификатор типа |
---|---|---|
23 | xx | 1 |
24 | yy | 1 |
25 | zz | 2 |
26 | 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
;