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;