Частичная сортировка

Стандартный раздел 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 Ранг студента
  Асанов    
  Шумаков    
  Иванов    
  Андреева    
  Канарейкин    
  Соколов    
  Яковлева    
  Морозов    

В начало


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: