Oracle rank: RANK ФУНКЦИЯ — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

Советы по функции ранжирования SQL

 

 

 

Советы Oracle от Лорана Шнайдера

Лоран
Шнайдер считается одним из лучших экспертов по Oracle SQL.
он автор книги «Продвинутый
Oracle SQL Programming» от Rampant TechPress.
это отрывок из книги.

Функции ранжирования

Семейство ранжирующих функций использует ORDER BY в
аналитическое предложение для перечисления строк или для извлечения предыдущих или
следующие ряды.

SELECT
   ENAME,
   HIREDATE,
   ROW_NUMBER() OVER (ORDER BY HIREDATE) ROW_NUMBER,
   LAG(ENAME) OVER (ORDER BY HIREDATE) LAG,
   LEAD(ENAME) OVER (ORDER BY HIREDATE) ВЫВОД
ОТ
   EMP
ЗАКАЗАТЬ BY
   HIREDATE;

ENAME      HIREDATE
ROW_NUMBER LAG        LEAD
———- ——— ———- ———- ——- —
SMITH      17-DEC-80          1            ALLEN
ALLEN      20-FEB-81          2 SMITH      WARD
WARD       22-FEB-81          3 АЛЛЕН      ДЖОНС
ДЖОНС      02 АПРЕЛЬ 81          4 Уорд       БЛЕЙК
БЛЕЙК      01 МАЯ 81 г.           5 ДЖОНС      CLARK
CLARK      09-JUN-81          6 BLAKE      TURNER
TURNER     08-SEP-81          7 CLARK      MARTIN
МАРТИН     28-SEP-81          8 ТЕРНЕР     KING
KING       17-NOV-81          9 MARTIN     JAMES
JAMES      03-DEC-81         10 KING       FORD
FORD       03-DEC-81         11 JAMES      MILLER
MILLER     23-JAN-82         12 FORD       SCOTT
SCOTT      19 апреля 87         13 MILLER     ADAMS
ADAMS      23 мая 87 года         14 SCOTT

ROW_NUMBER возвращает номер строки в указанном
заказ. LAG возвращает предыдущую строку, а LEAD возвращает следующую строку.
Функции LAG и LEAD не являются детерминированными; для Джеймса и
Форд, дата проката та же, но функция возвращает другое
результаты, которые могут отличаться от одного исполнения к другому.

RANK и DENSE_RANK являются детерминированными.

SELECT
   ENAME,
   HIREDATE,
   ROW_NUMBER() OVER (ORDER BY HIREDATE) ROW_NUMBER,
   RANK() OVER (ORDER BY HIREDATE) RANK,
   DENSE_RANK() OVER (ЗАКАЗ ПО HIREDATE) DENSE_RANK
ОТ
   EMP
ЗАКАЗ BY
   HIREDATE;

ЭНАМЯ
HIREDATE  ROW_NUMBER       RANK DENSE_RANK
———- ——— ———- ———- —— —-
SMITH      17-DEC-80          1          1          1
АЛЛЕН      20-ФЕВ-81          2          2          2          2
Уорд       22-ФЕВ-81          3          3          3
ДЖОНС      02 апреля 81          4          4          4
БЛЕЙК      01 мая 81 года          5          5          5           5
CLARK      09 июня 8 1          6          6          6
ТЕРНЕР     08-SEP-81          7          7          7
МАРТИН     28-SEP-81          8          8          8
KING       17-NOV-81          9          9          9
ДЖЕЙМС      03-DEC-81         10         10         10
Ford 03-Dec-81 11 10 10 10
Miller 23-Jan-82 12 12 11
Скотт 19-апреля-87 13 13 12
Адамс 23-мая-87 14 14 13

Row_number всегда возвращает различные числа для для
дубликаты. И RANK, и DENSE_RANK возвращают повторяющиеся числа для
сотрудников с той же датой найма. Разница между ними заключается
DENSE_RANK не пропускает числа.

ROW_NUMBER, DENSE_RANK и RANK имеют разные
последствия. Поскольку различия между ними довольно тонкие,
Спецификация запроса должна быть очень точной, чтобы можно было
использоваться.

ВЫБЕРИТЕ
   НОМЕР ОТДЕЛА,
   ENAME,
   SAL
ИЗ
(
   ВЫБЕРИТЕ
      НОМЕР ОТДЕЛА,
      ENAME,
      S AL,
      ROW_NUMBER() ПРЕВЫШЕН
(РАЗДЕЛ ПО ОТДЕЛНОМУ ПРИКАЗУ ПО САЛ ДЕСК) Р
   ОТ
      EMP
)
ГДЕ
   R<=3
ЗАКАЗ
   DEPTNO,
   R;

    ОТДЕЛ
ENAME             SAL
———- ———- ———-
        10 KING             5000
        10 CLARK            2450
        10 МИЛЛЕР           1300
        20 СКОТТ            3000
20 FORD             3000
        20 JONES            2975
        30 BLAKE            2850
        30 ALLEN            1600
        30 TURNER           1500     

Примечание.   Аналитическая функция не может
использоваться в предложении WHERE, но только в SELECT или в ORDER
пункт ПО.

По умолчанию LEAD и LAG возвращают предыдущий и
следующие ряды. Второй аргумент позволяет получить n th
предыдущие и n -го -го следующего ряда. Третий аргумент определяет
значение по умолчанию.

ВЫБЕРИТЕ
   ENAME,
   SAL,
   LAG(SAL,1,0) БОЛЬШЕ (ORDER BY SAL) LAG1,
   LAG(SAL,2,0) OVER (ORDER BY SAL) LAG2,
   LAG(SAL,3,0) OVER (ORORBY BY) SAL) LAG3
ОТ
   EMP
ЗАКАЗАТЬ ПО
   SAL;

ЭНАМЯ
SAL       LAG1       LAG2       LAG3
———- ———- ———- ———- —— ——
СМИТ             800          0          0          0
ДЖЕЙМС             950        800          0          0 900 32 АДАМС            1100        950        800          0
WARD             1250       1100        950        800
МАРТИН           1250       1250       1100        950
МИЛЛЕР           1300       1250       1250       1100
ТЕРНЕР           1500       1300       1250       1250
АЛЛЕН            1600       1500       1300       1250
КЛАРК            2450       1600       1500       13 00
БЛЕЙК            2850       2450       1600       1500
ДЖОНС            2975       2850       2450 1600
SCOTT            3000       2975       2850       2450
FORD             3000       3000       2975       2850
K ING             5000       3000       3000       2975

Возвращаются значения последних трех строк.
Несуществующие значения по умолчанию равны 0.


 

Введение в функцию Rank в Oracle

В этой статье мы увидим, как использовать аналитическую функцию RANK в базе данных Oracle и как она помогает нам в анализе.

Что такое функция РАНГ?

 

Функция RANK — это аналитическая функция Oracle, которая вычисляет ранг извлекаемых значений или относительно набора строк. Одни и те же значения будут иметь один и тот же ранг для группы строк или последующих рангов, поскольку они привязаны к значениям, поэтому они могут не быть последовательными в последовательности или количестве, поскольку они могут различаться в каждом случае.

Аналитические функции действительно полезны, когда мы пытаемся использовать их для целей отчетности и помогают в принятии бизнес-решений. Чтобы использовать функцию RANK, нам нужно использовать «ЗАКАЗ ПО ПУНКТУ «.

Вы можете узнать больше о « Приказ по пункту «, нажав по этой ссылке на другую мою статью.

Функция RANK будет использоваться после применения к строкам предложения «ORDER BY» , как показано в синтаксисе ниже.

Синтаксис для функции RANK:

  RANK() ВНУТРИ ГРУППЫ (ORDER BY  <<имя столбца>> DESC/ASC) 
 

В аналитических функциях RANK нам не нужны условия PARTITIONED BY для успешного выполнения.

Возьмем пример получения рангов сотрудников по отделам.

 ВЫБЕРИТЕ ПЕРВОЕ_ИМЯ
,LAST_NAME , SALARY, DEPARTMENT_ID, RANK() OVER ( ORDER BY зарплата DESC) "Звание"
от СОТРУДНИКОВ  ГДЕ DEPARTMENT_ID =50 ;
 

Вывод:

 FIRST_NAME                               LAST_NAME                     SALARY   DEPARTMENT_ID       Звание
------------------------------ -------------------- ----- ---------- --------------- ----------
адам
Мэтью                        Вайс                           8000                50          2
Пайам                                                              7900              50          3
Shanta Vollman 6500 50 4
Кевин                          Mourgos                                           5800               50          5
Нандита                                              4200              50          6
Алексис                                                  4100              50          7
Сара                                                                                                                                                                                              
Бритни                                                             3900              50          9
Келли                                                                                                                                                                                                                                                                                              
  Renske Ladwig 3600 50 11 11 Дженнифер Дилли 3600 50 11 Тренна Раджс 3500 50 13 Джулия Деллингер 3400 50 14 
лаура
Джейсон                                                                3300                                                                                                                                                                                                                           
Уинстон                                                  3200              50         17
Сэмюэл                                                  3200              50         17
Стивен                                                  3200              50         17
Джулия Найер 3200 50 17
Кёртис                                                                  3100              50           21
Жан                                                                    3100                                                                                                                                                                                                         
 

Из вышеприведенного вывода мы видим, что мы не видим, что присвоенные RANKS являются последовательными в последовательности.