Доступные версии документации
Последовательное ранжирование записей
Функция

Определяет последовательный номер записи в разделе выборки данных.

Спецификация
   
<номер записи>::=
Синтаксические правила
  1. <Значимые выражения> в <OVER-спецификации> задают столбцы выборки, по которым выполняется разбивка выборки на разделы.

  2. <Имена столбцов> в <ORDER BY-спецификации> внутри <OVER-спецификации> задают имена ранжируемых столбцов.

Общие правила
  1. Ранжирование записей – это присвоение им определенных значений (рангов).

  2. Рангом текущей записи при последовательном ранжировании является её порядковый номер в текущем разделе выборки, т.е. значение ранга характеризует количество всех предшествующих или последующих записей после упорядочивания записей в разделе по ранжируемому значению, например:

    Значение ранжируемого столбца записи Ранг записи в выборке
     100 1
     200 1
     200 2
     200 3
     500 1
     500 2
     1000 1

    В приведенном примере значение ранга 1 свидетельствует о том, что у данной записи в разделе нет предшествующих записей; значение ранга 2 – у текущей записи в разделе выборки есть одна предшествующая запись; значение ранга 3 – у текущей записи в разделе есть две предшествующие записи и т.д.

  3. Функция выполняет ранжирование записей только внутри разделов, определяемых с помощью <OVER-спецификации>.

    create or replace table rank_exmp(i int, j int);
    insert into rank_exmp (i,j) values (1, 100);
    insert into rank_exmp (i,j) values (1, 200);
    insert into rank_exmp (i,j) values (1, 200);
    insert into rank_exmp (i,j) values (1, 200);
    insert into rank_exmp (i,j) values (2, 500);
    insert into rank_exmp (i,j) values (2, 500);
    insert into rank_exmp (i,j) values (2, 1000);
    select rownum, i, j, row_number() over (partition by i order by j) from rank_exmp;
    
    |          1|          1|        100|          1|
    |          2|          1|        200|          2|
    |          3|          1|        200|          3|
    |          4|          1|        200|          4|
    |          5|          2|        500|          1|
    |          6|          2|        500|          2|
    |          7|          2|       1000|          3|
  4. Данные в разделе сортируются в соответствии с <ORDER BY-спецификацией>, а затем каждой записи присваивается числовой ранг, начиная с 1.

  5. Алгоритм функции ROW_NUMBER в случае, когда не заданы столбцы для группировки записей и/или столбцы для ранжирования записей, аналогичен алгоритму функции RANK при этих же условиях (см. описание функции RANK).

    select row_number() over () from rank_tst;
    |          1|
    |          2|
    |          3|
    |          4|
    |          5|
    |          6|
    |          7|
    
    select rownum, row_number() over (partition by i)   from rank_tst;
    |          1|          1|
    |          2|          1|
    |          3|          2|
    |          4|          3|
    |          5|          1|
    |          6|          2|
    |          7|          1|
  6. В <OVER-спецификации> можно задавать выражение, по которому должны формироваться разделы ранжируемых значений. Например, так можно проранжировать все записи таблицы, не создавая в ней специального столбца, по которому выполняется разбивка выборки на разделы (на примере приведенной выше таблицы rank_tst):

    select row_number() over (partition by 'aaa' order by i)  from rank_tst;
    |          1|
    |          2|
    |          2|
    |          2|
    |          5|
    |          5|
    |          7|
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter