Синтаксис T-Sql для ранжирования поля на основе нескольких критериев

У меня есть SQL-запрос в SQL Server 2014, который выводит следующее (показан отрывок, реальный вывод составляет около 45 000 записей):

ResaID  Agency   Sales     MTH           Market     Property

 235   Smith     500    February 2015      UK         RAV

 451   John     1600    February 2015     France      PLN

 258   Alan      800    January 2015      UK          BLS

Мне нужен SQL-запрос, который ранжирует столбец агентства на основе следующих критериев: MTH, Market и Property и дает мне следующий результат (фиктивный рейтинг, показанный ниже):

ResaId   Rank

 235       10

 451       2

 258       9

Затем я буду использовать JOIN на основе ResaID, чтобы присоединиться к «Выводу ранга» с моим первоначальным запросом.

Проще говоря, ранжирование Агентства необходимо будет выполнить после группировки MTH, Market и Property.

Можно ли этого добиться с помощью синтаксиса T-SQL?

Изменить: я хочу, чтобы ранжирование производилось на основе суммы продаж.


person user3115933    schedule 16.06.2015    source источник
comment
что такое 10? что такое 2? что такое 9? почему 10? почему 2? почему 9?   -  person Giorgi Nakeuri    schedule 16.06.2015
comment
см. этот ответ stackoverflow.com/questions/7747327/sql -ранг-номер-строки   -  person TheGameiswar    schedule 16.06.2015
comment
@GiorgiNakeuri 10 означает, что на рынке Property RAV и Великобритании Смит занимает 10-е место в феврале 2015 года по объему продаж. В остальном такая же логика.   -  person user3115933    schedule 16.06.2015
comment
@TheGameiswar Спасибо за ссылку, но я все еще немного смущен рангом и номером строки. Под рангом я имел в виду заданный номер ранга от наибольшего к наименьшему. В моем примере, если у меня есть 20 записей о рынке недвижимости X в Великобритании за февраль 2015 года, ранг 1 будет присвоен агентству, достигшему самых высоких продаж, и так далее, а агентству, достигшему самых низких продаж, будет присвоен ранг 20.   -  person user3115933    schedule 16.06.2015


Ответы (1)


Да, вы можете написать что-то вроде этого:

SELECT *, RANK() OVER(PARTITION BY Agency, mht ORDER BY sales DESC)
FROM [yourTable]
person Ionic    schedule 16.06.2015
comment
Кстати. Если вам нужен ранг с отличительными значениями, вы можете использовать плотное_ранг(), которое будет работать так же, как мой пример кода выше. - person Ionic; 16.06.2015
comment
Возможно, я недостаточно ясно выразился в своем сообщении. Я хочу, чтобы рейтинг был сделан на основе суммы продаж. Я отредактировал свой пост соответственно. - person user3115933; 16.06.2015
comment
Я изменил сценарий, просто измените столбец и измените порядок сортировки. Должен сделать то же самое, что и скрипт ранее. - person Ionic; 16.06.2015
comment
@Ionic Спасибо, но это не совсем то, что я хотел. В моем примере, если у меня есть 20 записей о рынке недвижимости X в Великобритании за февраль 2015 года, ранг 1 будет присвоен агентству, достигшему наивысших продаж, и так далее, а агентству, достигшему наименьшего объема продаж, присваивается ранг 20. По сути, запрос должен сначала сгруппировать все данные по одному и тому же ресурсу, одному месяцу и одному рынку, а затем ранжировать их, присваивая агентству с наибольшим объемом продаж РАНГ 1 и так далее. Таким образом, мои 45 000 записей будут сгруппированы по свойству, месяцу и рынку, и ранжирование будет выполнено в этих кластерах. - person user3115933; 16.06.2015
comment
Я добавил группировку, которая изначально присутствовала, поскольку вы сказали, что это неправильно :-D. Я не знаю, какие поля были необходимы для вашей группировки. Но вы должны получить это с этим примером. - person Ionic; 16.06.2015