Предложение OVER в Oracle

54

В чем смысл предложения OVER в Oracle?

Теги:
window-functions

3 ответа

57
Лучший ответ

Предложение OVER указывает разделение, упорядочение и окно "над которым" работает аналитическая функция.

Например, это вычисляет скользящее среднее:

AVG(amt) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)

date   amt   avg_amt
=====  ====  =======
1-Jan  10.0  10.5
2-Jan  11.0  17.0
3-Jan  30.0  17.0
4-Jan  10.0  18.0
5-Jan  14.0  12.0

Он работает над движущимся окном (по 3 строки) по строкам, упорядоченным по дате.

Это вычисляет текущий баланс:

SUM(amt) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

date   amt   sum_amt
=====  ====  =======
1-Jan  10.0  10.0
2-Jan  11.0  21.0
3-Jan  30.0  51.0
4-Jan  10.0  61.0
5-Jan  14.0  75.0

Он работает над окном, которое включает текущую строку и все предыдущие строки.

Это вычисляет максимум отдельно для каждого "дельта":

MAX(amt) OVER (PARTITION BY dept)

dept  amt   max_amt
====  ====  =======
ACCT   5.0   7.0
ACCT   7.0   7.0
ACCT   6.0   7.0
MRKT  10.0  11.0
MRKT  11.0  11.0
SLES   2.0   2.0

Он работает над окном, которое включает все строки для определенного отдела.

SQL Fiddle: http://sqlfiddle.com/#!4/9eecb7d/122

  • 0
    Не могли бы вы объяснить, как OVER () работает, когда используется без аргумента?
  • 3
    Отсутствие аргумента означает, что оно распространяется на весь набор результатов.
Показать ещё 2 комментария
25

Вы можете использовать его для преобразования некоторых агрегатных функций в аналитические:

SELECT  MAX(date)
FROM    mytable

возвращает строку 1 с единственным максимумом,

SELECT  MAX(date) OVER (ORDER BY id)
FROM    mytable

вернет все строки с максимальным пробегом.

  • 2
    Вы делаете очень хорошее замечание о преобразовании агрегатных функций в аналитические. Это один из способов, которым я никогда не думал об этом.
17

Ещё вопросы

Сообщество Overcoder
Наверх
Меню