Как упорядочить по одному столбцу, но ранжировать по другому столбцу, который не является числовым? - PullRequest
1 голос
/ 13 июня 2019

У меня есть четыре столбца, которые я пытаюсь оценить. Они должны быть сгруппированы по идентификатору сотрудника, а затем перечислены по убыванию по номеру заказа. Затем, когда все в порядке, я действительно пытаюсь получить рейтинг того, где город падает в этом порядке. Если один и тот же город указан за другим для одного и того же сотрудника, то я хочу, чтобы те оценивали его.

Пример таблицы приведен ниже. Порядок правильный, но рейтинг не соответствует тому, что я пытаюсь сделать.

Name            Employee_ID     Order_Number     City       Rank   
John               1                1            Boston       1  
John               1                2            Boston       2  
Will               2                1            Peabody      1  
Will               2                2            Weston       2   
Will               2                3            Newton       3



select Name, Employee_ID, Order_Number, City,
dense_rank() over(partition by Employee_ID order by Order_Number) as rank
from #Employee

Как бы я на самом деле хотел получить результаты:

Name            Employee_ID     Order_Number     City       Rank   
John               1                1            Boston       1  
John               1                2            Boston       1  
Will               2                1            Boston       1  
Will               2                2            Weston       2   
Will               2                3            Newton       3  

Тогда я бы в конечном итоге удалил дубликаты городов, чтобы в итоге получить:

Name            Employee_ID     Order_Number     City       Rank   
John               1                1            Boston       1  
Will               2                1            Boston       1  
Will               2                2            Weston       2   
Will               2                3            Newton       3

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Вы можете использовать LAG(), чтобы проверить, совпадает ли предыдущий город. Если предыдущий город отличается или равен нулю, тогда мы берем ранг таким, какой он есть, если города одинаковы, тогда ранг - 1 дает нам то же число, что и строка выше. Демо

with cte as (select Name, Employee_ID, Order_Number, City,
dense_rank() over (partition by Employee_ID order by Order_Number) as rank,
lag(City) over (partition by Employee_ID order by Order_Number) as previousCity
from #Employee)
select 
    Name, Employee_ID, Order_Number, City,
    case when previousCity = city then rank - 1
         else rank end as rank
from cte
0 голосов
/ 13 июня 2019

Вы можете попробовать следующий скрипт, чтобы получить желаемый результат.

SELECT Name, Employee_ID, Order_Number, City ,
ROW_NUMBER() OVER (PARTITION BY Employee_ID ORDER BY Order_Number) rank
(
    select Name, Employee_ID, Order_Number, City,
    dense_rank() over(partition by Employee_ID,city order by Order_Number) as rank
    from #Employee
)A
WHERE rank = 1

Вывод из вашего набора результатов -

Name    Employee_ID Order_Number    City    rank
John    1           1               Boston  1
Will    2           1               Peabody 1
Will    2           2               Weston  2
Will    2           3               Newton  3

Проверьте вывод скрипта на Fiddle .

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