【发布时间】:2010-11-08 16:37:00
【问题描述】:
Oracle中的OVER子句是什么意思?
【问题讨论】:
-
天哪,没有人喜欢 Oracle 手册。 Stackoverflow 每次都有 ELI5 的解释!
标签: sql oracle window-functions
Oracle中的OVER子句是什么意思?
【问题讨论】:
标签: sql oracle window-functions
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 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
它在一个包含特定部门所有行的窗口上运行。
【讨论】:
您可以使用它来将一些聚合函数转换为解析:
SELECT MAX(date)
FROM mytable
将返回具有单个最大值的1 行,
SELECT MAX(date) OVER (ORDER BY id)
FROM mytable
将返回具有运行最大值的所有行。
【讨论】:
它是Oracle analytic functions 的一部分。
【讨论】:
另一种使用 OVER 的方法是让您的选择中的结果列对另一个“分区”进行操作,可以这么说。
这个:
SELECT
name,
ssn,
case
when ( count(*) over (partition by ssn) ) > 1
then 1
else 0
end AS hasDuplicateSsn
FROM table;
对于其 ssn 被另一行共享的每一行,在 hasDuplicateSsn 中返回 1。非常适合为不同的错误报告等数据制作“标签”。
【讨论】: