代码之家  ›  专栏  ›  技术社区  ›  paweloque

Oracle中的OVER子句

  •  84
  • paweloque  · 技术社区  · 16 年前

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

    4 回复  |  直到 10 年前
        1
  •  85
  •   Jeffrey Kemp    5 年前

    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
    

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

    注:对于具有 结束 指定排序的子句 ORDER ,默认窗口为 UNBOUNDED PRECEDING 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

        2
  •  32
  •   Quassnoi    16 年前

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

    SELECT  MAX(date)
    FROM    mytable
    

    会回来的 1 具有单个最大值的行,

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

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

        3
  •  20
  •   cletus    16 年前
        4
  •  0
  •   stobix    5 年前

    使用OVER的另一种方法是让select中的结果列对另一个“分区”进行操作。

    这个:

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

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