Функции RANK() и DENSE_RANK() стр. 2 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Пример использования DENSE_RANKЧасто встречается задача нахождения N-го по величине значения из набора значений некоторого столбца таблицы, например: Найти второе по величине значение цены в таблице PC. Давайте выведем отсортированный список значений цены из таблицы PC для контроля, добавив столбцы со значениями ранжирующих функций:
В рамках стандарта SQL-92 эту задачу можно решить следующим образом:
Т.е. мы находим значение максимума среди всех значений, меньших максимального. А если нам потребуется найти значение третьей по величине цены? Можно поступить аналогично:
А как найти N-е значение цены? Следуя используемой логике, мы можем добавлять новые "матрешки" к уже существующим вплоть до N-ой. Это решение никак не назовешь универсальным. Для решения подобных задач хорошо подходит функция DENSE_RANK. Например, исходную задачу с помощью этой функции можно решить так:
А чтобы найти любую другую порядковую цену (например, третью), достаточно поменять константу в условиях отбора:
Следует отметить, что использование DENSE_RANK, а не RANK, обусловлено тем, что в случае наличия одинаковых цен, значения, возвращаемые функцией RANK, будут иметь пропуски (рассмотрите задачу нахождения пятой по величине цены). Если же ставить задачу нахождения неуникального N-го значения, то можно использовать функцию ROW_NUMBER (например, третий человек в шеренге по росту). А если значения в таблице уникальны, то решение с помощью любой из этих функций даст один и тот же результат.
|