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
Другие вопросы по тегам