Использование rank () с разделением по и упорядочением - PullRequest
0 голосов
/ 10 марта 2020

Задача:

Если у пользователя есть несколько проектов, то ранжируйте проекты в следующем порядке: 1) Фотокнига 2) Карточка 3) любой другой тип проекта

Я пытался написать запрос, который оценит для меня типы заказов, которые сделал пользователь. Поэтому мне нужно получить 1 за «фотокнигу», 2 за «карточку» и 3 за то, что он заказал.

В моем Excel у меня есть только 1 заказ на каждого пользователя, которого нет совсем book 'или' card ', поэтому должен получить для каждого пользователя число 3.

Это запрос, который я пробовал:

select f.USER_SK,
       rank() over (partition by f.user_sk 
                          order by case when d.PROJECT_TYPE='photobook' then 1 end,                                                              
                                   case when d.PROJECT_TYPE='card' then 2 end,
                                   case when d.project_type not in ('card','photobook') then 3 end 
                         ) as [rank]
 from Project_f f inner join
      project_d d
      on f.PROJECT_SK=d.PROJECT_SK

Результат, который я получаю, равен 1 для каждого пользователя, хотя нет из них ветвь фотокниги.

Ответы [ 4 ]

1 голос
/ 10 марта 2020

Звучит так, как будто вы вообще не хотите row_number(). Я предполагаю, что у вас есть только одна строка на пользователя. Если так:

   (case when d.PROJECT_TYPE = 'photobook' then 1                                                              
         when d.PROJECT_TYPE = 'card' then 2
          else 3
    end) as [rank]
0 голосов
/ 12 марта 2020

Группировка по пользователю и использование условного агрегирования:

select f.USER_SK,
  min(
    case d.PROJECT_TYPE
      when 'photobook' then 1                                                               
      when 'card' then 2
      else 3 
    end
  ) rn
from Project_f f inner join project_d d
on f.PROJECT_SK=d.PROJECT_SK
group by f.USER_SK
0 голосов
/ 10 марта 2020

Мне удалось!

- Если у пользователя есть несколько проектов, ранжируйте проекты в следующем порядке: 1) Фотокнига 2) Карточка 3) любой другой тип проекта -

select f.user_sk, 
case 
when d.PROJECT_TYPE='photobook' then 1
when d.PROJECT_TYPE='card' then 2
else 3 end as rank
 from Project_f f inner join
      project_d d
      on f.PROJECT_SK=d.PROJECT_SK
group by f.USER_SK, d.PROJECT_TYPE
order by f.USER_SK

0 голосов
/ 10 марта 2020

Я думаю, что вы слишком усложняете вещи. Намереваетесь ли вы иметь 3 отдельных случая?

select f.user_sk, 
case 
when d.PROJECT_TYPE='photobook' then 1
when d.PROJECT_TYPE='card' then 2
else 3 end as rank
 from Project_f f inner join
      project_d d
      on f.PROJECT_SK=d.PROJECT_SK
order by rank
...