【问题标题】:OVER clause in OracleOracle 中的 OVER 子句
【发布时间】:2010-11-08 16:37:00
【问题描述】:

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

【问题讨论】:

标签: sql oracle window-functions


【解决方案1】:

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 子句指定排序ORDER 的聚合,默认窗口是UNBOUNDED PRECEDINGCURRENT 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

【讨论】:

  • 你能解释一下 OVER() 在没有参数的情况下是如何工作的吗?
  • 无参数意味着它覆盖整个结果集。
  • 为什么在你的第一个例子中它从第一行计算前一个为零?这是你可以改变的吗?
  • 嗨,k9b,它说“1 个 PRECEDING 和 1 个 FOLLOWING”,这是一个最多跨越 3 条记录的窗口 - 但该窗口从不暗示必须有 3 条记录。它只找到两条记录,并计算这两条记录的平均值。注意:我会修复一个复制粘贴错误。
【解决方案2】:

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

SELECT  MAX(date)
FROM    mytable

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

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

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

【讨论】:

  • 关于将聚合函数转换为分析函数的观点非常好。这是我从未想过的一种方式。
【解决方案3】:

它是Oracle analytic functions 的一部分。

【讨论】:

    【解决方案4】:

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

    这个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2022-01-23
      • 2012-12-19
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多