OVER-спецификация

Функция

Определение разбивки на группы результирующей выборки данных.

Спецификация

   
< OVER-спецификация >::=

Синтаксические правила

  1. < Значимое выражение > должно быть именем столбца. Использование псевдонимов или выражений не допускается.

  2. В < запросе выборки > может использоваться только одна < 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;

Общие правила

  1. Конструкция PARTITION BY выполняет разбивку результирующего набора данных на разделы с целью последующего применения к ним агрегатных или аналитических функций.

  2. Если конструкция PARTITION BY опущена, то < OVER-спецификация > распространяется на весь результирующий набор данных.

  3. < ORDER BY-спецификация > задает логический порядок, в котором должны выполняться вычисления применяемой к разделу данных агрегатной или аналитической функции (а не порядок представления результата, как обычная < ORDER BY-спецификация >).

  4. Если < ORDER BY-спецификация > опущена, то < OVER-спецификация > распространяется на весь результирующий набор данных.

  5. В тексте запроса перед < OVER-спецификацией > должна указываться аналитическая функция, применяемая к получаемым наборам данных.

    select personid, 
           make, 
           lag(make)over (partition by model, bodytype order by personid desc)
      from auto;
  6. Если задана опция 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;