SQL: Оконные функции
Теория: Другие функции
Ранжирующая функция - это функция, в которой стоит присвоение последовательности при определенной группировке и сортировке. Помимо ранжирующих функций NTILE() и ROW_NUMBER() существуют и другие. Мы изучим их в этом уроке.
Функции RANK DENSE_RANK
Функция RANK() присваивает каждой строке результата запроса ранг в соответствии с заданным порядком. Если несколько строк имеют одинаковое значение, им будет присвоен одинаковый ранг, и следующий ранг будет увеличен на количество строк, занявших предыдущий ранг. Например, если у вас есть строки с рангами 1, 2, 2, то следующий ранг будет 4.
Функция DENSE_RANK() также присваивает ранг каждой строке, но в отличие от RANK(), она не пропускает ранги при наличии одинаковых значений. Это означает, что если несколько строк имеют одинаковое значение, им будет присвоен одинаковый ранг, но следующий ранг будет увеличен на 1, а не на количество строк, занявших предыдущий ранг. Например, если у вас есть строки с рангами 1, 2, 2, то следующий ранг будет 3.
Рассмотрим на примере. Посмотрим, как продались товары и какое место они занимают в рейтинге продаж:
RANK() нумерует записи, но при этом учитывает повторяющиеся значения и присваивает им одинаковый ранг, после чего следующая запись получает ранг на единицу больше. Если есть несколько записей с одинаковым значением, они получат один и тот же ранг, а следующая запись получит следующий уникальный ранг. DENSE_RANK() пропускает ранги в случае повторяющихся значений. То есть он не оставляет промежутки между рангами, если есть одинаковые значения.
Таким образом, различие между RANK() и DENSE_RANK() в том, что RANK() может иметь пропуски в рангах при повторяющихся значениях, а DENSE_RANK() не имеет таких пропусков.
ROWS и RANGE
Инструкции ROWS и RANGE используются вместе с функциями оконного анализа, такими как RANK() и DENSE_RANK(), для определения диапазона строк, на которые должна распространяться аналитическая функция. ROWS определяет физические границы диапазона. Например, ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING означает текущую строку и две соседние строки, в то время как RANGE работает не со строками, а со значениями столбцов, отсортированных ORDER BY.
Например, вы можете использовать ROWS для вычисления суммы значений в столбце по диапазону строк, определенному ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING, или использовать RANGE для вычисления среднего значения в столбце по логическому диапазону значений.
Ключевые слова ROWS и RANGE:
UNBOUNDED PRECEDINGуказывает, что окно начинается с первой строки группыUNBOUNDED FOLLOWINGс помощью данной инструкции можно указать, что окно заканчивается на последней строке группыCURRENT ROWинструкция указывает, что окно начинается или заканчивается на текущей строкеBETWEEN <граница окна> AND <граница окна>указывает нижнюю и верхнюю границу окна<значение> PRECEDINGопределяет число строк перед текущей строкой (не допускается в предложенииRANGE)<значение> FOLLOWINGопределяет число строк после текущей строки (не допускается в предложенииRANGE)
Рассмотрим пример по поиску среднего значения продажи между предыдущей, текущей и следующей покупкой
В данном примере сумма и среднее значение вычисляется между предыдущей, текущей и следующей записью. Такой запрос может быть использован, например, для вычисления средней суммы заказа на основе предыдущего и следующего заказов. Это может помочь в анализе динамики продукции и выявлении возможных тенденций.
Выводы
В целом, ранжирующие функции и форточные функции в SQL предоставляют мощные инструменты для анализа данных и вычислений на уровне группы строк, что делает их важным инструментом для работы с большими объемами данных и выполнения сложных аналитических задач.
Рекомендуемые программы
Завершено
0 / 9

