Функции упорядочения возвращают упорядоченное значение каждой строки в группе раздела. Transact-SQL поддерживает следующие функции упорядочения:
♦ rank;
♦ dense_rank;
♦ row_number.
В примере 24.14 показано использование функции rank.
Пример 24.14 использует функцию rank для получения количества (в первом столбце результирующего набора), которое задает порядок строки среди других строк. Пример использует предложение over для сортировки результирующего набора по столбцу budget в убывающем порядке. В этом примере опущено предложение partition by. Поэтому весь результирующий набор будет принадлежать только одному разделу.
В примере 24.15 показано использование двух других функций упорядочения: dense_rank и row_number.
Первые два столбца в результирующем наборе примера 24.15 показывают значения функций dense_rank и rownumber соответственно. Вывод функции denserank похож на вывод функции rank (см. пример 24.14). Единственным отличием является то, что функция dense_rank не возвращает «дыры», если два или более ранжируемых значения равны и, следовательно, имеют один и тот же ранг.
Использование функции rownumber очевидно: она возвращает последовательный номер строки в результирующем наборе, начиная с 1 для первой строки.
В последних двух примерах предложение over служит для определения порядка результирующего набора. Как вы уже знаете, это предложение также может быть использовано для разделения результирующего набора, созданного предложением from, на группы (разделы), а затем для применения агрегатной или упорядочивающей функции отдельно для каждого раздела.
В примере 24.16 показано, как функция rank может быть применена к разделам.
Результирующий набор в примере 24.16 разделен (выделен по разделам) на шесть групп в соответствии со значениями столбца datemonth. После того, как функция rank будет применена к каждому разделу. Если вы внимательно посмотрите и сравните предыдущий пример с примером 24.5, то вы увидите, что последний пример работает, тогда как пример 24.5 выдает ошибку, хотя оба примера используют одну и ту же конструкцию окна. Как ранее было сказано, в настоящий момент Transact-SQL поддерживает предложение over для агрегатных функций только с предложением partition by, но в случае функций упорядочения система поддерживает общий синтаксис стандарта SQL с предложениями partition by и order by.