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;