2009-07-07 58 views
54

Oracle中OVER子句的含義是什麼?Oracle中的OVER子句

+0

如有疑問,請閱讀手冊:http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174 – 2015-09-07 07:33:13

回答

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 2014-04-08 11:09:05

24

你可以用它來轉變一些聚合函數解析到:

SELECT MAX(date) 
FROM mytable 

將返回1行與單一最大,

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

將返回與正在運行的最大的所有行。

+2

你做一個很好的指出將聚合函數轉化爲分析函數。這是我從未想過的一種方式。 – user128216 2016-03-18 12:53:36