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;