Oracle中的OVER子句

时间:2009-07-07 12:47:18

标签: sql oracle window-functions

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

4 个答案:

答案 0 :(得分:72)

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

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

分别为每个“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

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

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

答案 1 :(得分:26)

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

SELECT  MAX(date)
FROM    mytable

将返回1行,其中包含一个最大值

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

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

答案 2 :(得分:18)

这是Oracle analytic functions

的一部分

答案 3 :(得分:0)

另一种使用 OVER 的方法是在你的 select 中有一个结果列对另一个“分区”进行操作,可以这么说。

这个:

SELECT 
    name, 
    ssn, 
    case 
      when ( count(*) over (partition by ssn) ) > 1      
      then 1
      else 0
    end AS hasDuplicateSsn
FROM table;

对于 ssn 被另一行共享的每一行,在 hasDuplicateSsn 中返回 1。非常适合为不同的错误报告等数据制作“标签”。