Последовательное ранжирование записей
Функция
Определяет последовательный номер записи в разделе выборки данных.
Спецификация
::=
Синтаксические правила
-
< Значимые выражения >
в< 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|