Oracle: приоритетность результатов на основе значения столбца
У меня есть набор данных, в котором есть дубликаты идентификаторов в первом столбце. Я надеюсь получить одну строку данных для каждого идентификатора на основе значения второго столбца. Данные выглядят так:
ID Info_Source Prior?
A 1 Y
A 3 N
A 2 Y
B 1 N
B 1 N
B 2 Y
C 2 N
C 3 Y
C 1 N
В частности, критерии будут требовать определения приоритетов на основе значения второго столбца (3 с наивысшим приоритетом; затем 1 и, наконец, 2): если столбец "Info_Source" имеет значение 3, вернуть эту строку; если во втором столбце нет 3 для данного идентификатора, ищите 1 и, если найдено, возвращайте эту строку; и, наконец, если с идентификатором нет 3 или 1, найдите 2 и верните эту строку для идентификатора.
Желаемые результаты будут представлять собой одну строку для каждого идентификатора, а результирующие данные будут:
ID Info_Source Prior?
A 3 N
B 1 N
C 3 Y
1 ответ
row_number() over() обычно хорошо и эффективно решает эти задачи, например
select ID, Info_Source, Prior
from (
select ID, Info_Source, Prior
, row_number() over(partition by id order by Info_source DESC) as rn
)
where rn = 1
Для определения приоритетов значения второго столбца (3; затем 1, затем 2) используйте выражение case, чтобы изменить необработанное значение в нужный вам порядок.
select ID, Info_Source, Prior
from (
select ID, Info_Source, Prior
, row_number() over(partition by id
order by case when Info_source = 3 then 3
when Infor_source = 1 then 2
else 1 end DESC) as rn
)
where rn = 1