Определяет последовательный номер записи в разделе выборки данных.
::=
<Значимые выражения>
в <OVER-спецификации>
задают столбцы выборки, по которым выполняется разбивка выборки на разделы.
<Имена столбцов>
в <ORDER BY-спецификации>
внутри <OVER-спецификации>
задают имена ранжируемых столбцов.
Ранжирование записей – это присвоение им определенных значений (рангов).
Рангом текущей записи при последовательном ранжировании является её порядковый номер в текущем разделе выборки, т.е. значение ранга характеризует количество всех предшествующих или последующих записей после упорядочивания записей в разделе по ранжируемому значению, например:
Значение ранжируемого столбца записи | Ранг записи в выборке | ||
---|---|---|---|
100 | 1 | ||
200 | 1 | ||
200 | 2 | ||
200 | 3 | ||
500 | 1 | ||
500 | 2 | ||
1000 | 1 |
В приведенном примере значение ранга 1 свидетельствует о том, что у данной записи в разделе нет предшествующих записей; значение ранга 2 – у текущей записи в разделе выборки есть одна предшествующая запись; значение ранга 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|
Данные в разделе сортируются в соответствии с <ORDER BY-спецификацией>
, а затем каждой записи присваивается числовой ранг, начиная с 1.
Алгоритм функции 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|
В <OVER-спецификации>
можно задавать выражение, по которому должны формироваться разделы ранжируемых значений. Например, так можно проранжировать все записи таблицы, не создавая в ней специального столбца, по которому выполняется разбивка выборки на разделы (на примере приведенной выше таблицы rank_tst)
:
select row_number() over (partition by 'aaa' order by i) from rank_tst; | 1| | 2| | 2| | 2| | 5| | 5| | 7|