OVER-спецификация
Функция
Определение разбивки на группы результирующей выборки данных.
Спецификация
::=
Синтаксические правила
-
< Значимое выражение >
должно быть именем столбца. Использование псевдонимов или выражений не допускается. -
В
< запросе выборки >
может использоваться только одна< OVER-спецификация >
, т.е. запрос видаselect (rank() over (order by rowid))/(rank() over (order by rowid desc)) from auto where rowid< 10;
выполняться не будет. Это ограничение можно обойти следующим образом:
select a/b from (select (rank() over (order by rowid)) a,(rank() over (order by rowid desc)) b from auto where rowid< 10);
Примечание
Для агрегатных функций такого ограничения нет, т.е. приведенный ниже запрос будет выполнен:
select sum(personid) over (partition by make) / sum(personid) over (partition by model) from auto where rowid< 10;
Общие правила
-
Конструкция
PARTITION BY
выполняет разбивку результирующего набора данных на разделы с целью последующего применения к ним агрегатных или аналитических функций. -
Если конструкция
PARTITION BY
опущена, то< OVER-спецификация >
распространяется на весь результирующий набор данных. -
< ORDER BY-спецификация >
задает логический порядок, в котором должны выполняться вычисления применяемой к разделу данных агрегатной или аналитической функции (а не порядок представления результата, как обычная< ORDER BY-спецификация >
). -
Если
< ORDER BY-спецификация >
опущена, то< OVER-спецификация >
распространяется на весь результирующий набор данных. -
В тексте запроса перед
< OVER-спецификацией >
должна указываться аналитическая функция, применяемая к получаемым наборам данных.select personid, make, lag(make)over (partition by model, bodytype order by personid desc) from auto;
-
Если задана опция
DISTINCT
, то она применяется к результатуOVER
(а не наоборот).select distinct first_value(InId) over (order by nvl(s.n1,0) desc, nvl(s.n2,0) desc, nvl(s.n3,0) desc) as InId1 from temp_table s;