Фильтрация с критериями приоритета на сервере SQL - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь отфильтровать Таблицу1:

 Table1

 Region             mCode   pCode
 Europa               AD    E
 Rest of the world    AD    O
 East Europa          AE    O
 Outside              AE    L
 Rest of the world    AE    E
 Asia                 AF    O
 North America        AG    D
 Rest of the world    AG    L
 North America        AI    D
 Rest of the world    AI    L
 America              AI    L

Существует четыре различных значения для pCode (D, L, E, O) и mCode, которые можно повторить.

Мне нужно получить только те строки, где mCode имеет pCode с наивысшим приоритетом в соответствии с:

Highest priority     pCode = D
Second priority      pCode = L 
Third priority       pCode = E 
last priority        pCode = O 

Например, mCode 'AE' отображается в 3 строках, а pCode 'O',«L» и «E» в разных строках. В соответствии с приоритетом pCode, результат показывает строку, где pCode является вторым приоритетом «L», поскольку для «AE» нет строки с более высоким приоритетом, чем «L». Остальные строки не имеют большого значения.

Желаемый результат имеет уникальные значения mCode:

 Region            mCode    pCode
 Europa            AD       E
 Outside           AE       L
 Asia              AF       O
 North America     AG       D
 North America     AI       D

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Вы можете использовать row_number (), чтобы назначить приоритет для mCode, а затем просто отфильтровать тот, который имеет наивысший приоритет

select *
from
(
    select *, p = row_number() over (partition by mCode
                                          order by case when pCode = 'D' then 1
                                                        when pCode = 'L' then 2
                                                        when pCode = 'E' then 3
                                                        when pCode = 'O' then 4
                                                        end)
    from   Table1
) d
where d.p = 1
1 голос
/ 07 октября 2019

Использование оконной функции ROW_NUMBER() с выражением CASE в виде

SELECT Region, mCode, pCode
FROM
(
SELECT *, 
ROW_NUMBER() OVER(PARTITION BY mCode ORDER BY CASE pCode WHEN 'D' THEN 0
                    WHEN 'L' THEN 1
                    WHEN 'E' THEN 2
                    WHEN 'O' THEN 3
                    END) RN
FROM
(
  VALUES
  ('Europa'               ,'AD',    'E'),
  ('Rest of the world'    ,'AD',    'O'),
  ('East Europa'          ,'AE',    'O'),
  ('Outside'              ,'AE',    'L'),
  ('Rest of the world'    ,'AE',    'E'),
  ('Asia'                 ,'AF',    'O'),
  ('North America'        ,'AG',    'D'),
  ('Rest of the world'    ,'AG',    'L'),
  ('North America'        ,'AI',    'D'),
  ('Rest of the world'    ,'AI',    'L'),
  ('America'              ,'AI',    'L')
) T(Region, mCode, pCode)
) TT
WHERE RN = 1;

Live Demo

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