Стандартный раздел ORDER BY команды SELECT лишен возможности создавать частичное упорядочение наборов данных. Для выполнения подобного рода операций предназначены функции ранжирования RANK(), DENSE_RANK(), ROW_NUMBER(), NTILE(). При этом упорядочение выполняется внутри группы строк, определяемых предложением PARTITION BY по полю, указанному после фразы ORDER BY.
Функция | Описание | Синтаксис |
RANK() | Возвращает ранг каждой строки внутри группы строк, определяемых предложением PARTITION BY. Ранг каждой строки равен рангу предыдущей, увеличенному на единицу. | RANK () OVER ([PARTITION BY < clause >] ORDER BY < clause>) |
DENSE_RANK() | Возвращает ранг каждой строки внутри группы строк, определяемых предложением PARTITION BY, без пропусков в ранжировании. Ранг каждой последующей строки равен индивидуальному рангу предыдущей, увеличенному на единицу | DENSE_RANK () OVER ([PARTITION BY < clause >] ORDER BY < clause>) |
ROW_NUMBER() | Определяет место объекта внутри группы однородных объектов, упорядоченных по какому-либо признаку. Данная функция возвращает последовательный номер строки внутри группы строк, определяемых предложением PARTITION BY, начиная с единицы для каждой первой строки внутри каждого новой группы строк | ROW_NUMBER () OVER ([PARTITION BY < clause >] ORDER BY < clause>) |
NTILE() | Делит группу строк, определяемую предложением PARTITION BY, на указанное количество рангов, причем функция «старается», чтобы количество строк в каждом из рангов было одинаковым. Для каждой строки возвращается номер ранга, которому она принадлежит | NTILE (integer_expression) OVER ([PARTITION BY < clause >] ORDER BY < clause>) |
Пример 47. Отсортируем студентов по каждой специальности в порядке убывания балла, назначая при этом студентам ранг в зависимости от балла. Ранг, равный единице, на каждой специальности должен получить студент, имеющий наибольший балл:
|
|
SELECT kod_s, fam, ball, DENSE_RANK () OVER (PARTITION BY kod_s ORDER BY ball DESC) “Ранг студента” FROM student;
Результат:
kod_s | fam | ball | Ранг студента |
Асанов | |||
Шумаков | |||
Иванов | |||
Андреева | |||
Канарейкин | |||
Соколов | |||
Яковлева | |||
Морозов |
Пример 48. В предыдущем запросе ранг каждой последующей строки равен индивидуальному рангу предыдущей, увеличенному на единицу:
SELECT kod_s, fam, ball, RANK () OVER (PARTITION BY kod_s ORDER BY ball DESC) “Ранг студента” FROM student;
Результат:
kod_s | fam | ball | Ранг студента |
Асанов | |||
Шумаков | |||
Иванов | |||
Андреева | |||
Канарейкин | |||
Соколов | |||
Яковлева | |||
Морозов |
В начало