Зачем нам нужен «упорядочить по» в row_number() поверх (упорядочить по имени столбца)?

Почему мы должны использовать «упорядочить по» во фразе в этом термине t-sql:

row_number() over(order by column name)

person Mehdi Salehdoost    schedule 11.04.2015    source источник


Ответы (3)


Если вы спрашиваете, почему обязательно размещать предложение ORDER BY в OVER CLAUSE (кроме того, что этого требует ANSI spec), который вы можете счесть избыточным, поскольку он является дополнением к общему предложению ORDER BY, которое будет помещено в конец запрос.

Полезность ORDER BY в предложении OVER() заключается в том, что вы можете пожелать чтобы применить другой ORDER BY ко всему запросу, чем порядок, применяемый при определении столбца, сгенерированного секционированной функцией ROW_NUMBER(). Рассмотрим следующий запрос, в котором мы хотим применить рейтинг к населению города в пределах (PARTITION BY) города, но в алфавитном порядке по названию страны и города:

Предположим, что у City есть (CountryName, CityName, Population)

select CountryName, CityName, 
       ROW_NUMBER() OVER (PARTITION BY CountryName 
                          ORDER BY Population DESC) AS RankedPopulation
FROM City
ORDER BY CountryName, CityName;

Что может привести к такому результату:

CountryName     CityName       RankedPopulation
--------------- -------------- -----------------
England         Liverpool      2
England         London         1
France          Lyons          2
France          Paris          1
USA             Los Angeles    2
USA             Miami          3
USA             New York       1

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

Обратите внимание, что в моем примере выше RANK будет более подходящим выбором, чем ROW_NUMBER - Я просто хотел сохранить контекст вашего вопроса.

SqlFiddle примера здесь

person StuartLC    schedule 11.04.2015

Row_Number на самом деле использует этот сценарий: предположим, что у нас есть эти записи (5,3,4,1,6) в номере строки, мы говорим, сколько существует элементов, что их значение меньше текущего? чтобы ответить на этот вопрос, нам нужен упорядоченный список. если нет, нам нужно выполнить итерацию по всему списку, чтобы узнать реальный счет.

person Vahid Farahmandian    schedule 11.04.2015

Из MSDN

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

person Rahul Tripathi    schedule 11.04.2015