78

Oracle中的OVER子句是什么意思?

4

4 回答 4

88

OVER子句指定了分析函数运行的分区、排序和“窗口”。

示例 #1:计算移动平均线

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 行宽)上运行。

示例 #2:计算流动余额

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

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

注意:对于带有OVER指定 sort 的子句的聚合ORDER,默认窗口是UNBOUNDED PRECEDINGto CURRENT ROW,所以上面的表达式可以简化为,结果相同:

SUM(amt) OVER (ORDER BY date)

示例#3:计算每组内的最大值

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

于 2009-07-07T15:54:17.597 回答
32

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

SELECT  MAX(date)
FROM    mytable

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

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

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

于 2009-07-07T12:50:16.767 回答
20

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

于 2009-07-07T12:48:15.567 回答
0

使用 OVER 的另一种方法是让您的选择中的结果列对另一个“分区”进行操作,可以这么说。

这:

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

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

于 2021-02-12T13:55:00.530 回答