Oracle中的OVER子句


Answers:


82

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


1
您能否解释不带参数使用OVER()的工作原理?
Yasen 2014年

3
没有参数意味着它覆盖整个结果集。
杰弗里·肯普

为什么在第一个示例中,它将第一行中的前一个计算为零?那可以改变吗?
6

嗨,k9b,它说“ 1 PRECEDING AND 1 FOLLOWING”,它是一个最多可包含3条记录的窗口-但是该窗口从不暗示必须有3条记录。它仅查找两个记录,并计算这两个记录的平均值。注意:有一个复制粘贴错误,我将修复。
杰弗里·肯普

31

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

SELECT  MAX(date)
FROM    mytable

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

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

将返回具有运行最大值的所有行。


2
您将聚合函数转换为解析函数非常有用。那是我从未想过的一种方式。
user128216 '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.