Oracle中的OVER子句

paw*_*que 67 sql oracle window-functions

Oracle中OVER子句的含义是什么?

Jef*_*emp 77

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
Run Code Online (Sandbox Code Playgroud)

它在行上方的移动窗口(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
Run Code Online (Sandbox Code Playgroud)

它在包含当前行和所有先前行的窗口上运行.

这为每个"dept"分别计算最大值:

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
Run Code Online (Sandbox Code Playgroud)

它在一个窗口上运行,该窗口包含特定部门的所有行.

SQL小提琴:http://sqlfiddle.com/#!4/9eecb7d/ 122

  • 没有参数意味着它在整个结果集上的范围. (3认同)

Qua*_*noi 27

您可以使用它将一些聚合函数转换为分析函数:

SELECT  MAX(date)
FROM    mytable
Run Code Online (Sandbox Code Playgroud)

将返回1一个最大值的行,

SELECT  MAX(date) OVER (ORDER BY id)
FROM    mytable
Run Code Online (Sandbox Code Playgroud)

将返回具有最大运行的所有行.

  • 您对将聚合函数转换为分析函数提出了非常好的观点.这是我从未想过的一种方式. (2认同)

cle*_*tus 18

它是Oracle分析功能的一部分.