2009-07-07 2 views

ответ

60

Предложение 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 Скрипки: http://sqlfiddle.com/#!4/9eecb7d/122

+0

Не могли бы вы объяснить, как работает OVER() при использовании без аргументов? – Lamy

+3

Ни один аргумент не означает, что он охватывает весь набор результатов. –

+0

Почему в первом примере он вычисляет предыдущий из первой строки как ноль? Это то, что вы можете изменить? – k9b

24

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

SELECT MAX(date) 
FROM mytable 

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

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

возвращает все строки с запущенной максимум.

+2

Вы делаете очень хорошее о преобразовании агрегатных функций в аналитические. Так я и не думал об этом. – user128216

Смежные вопросы