ITPub博客

首页 > 数据库 > Oracle > 分析sum(x) over(partition by y ORDER BY z) [分析函数]

分析sum(x) over(partition by y ORDER BY z) [分析函数]

Oracle 作者:SmartWilson 时间:2015-05-14 10:34:21 0 删除 编辑

本文来源于http://www.cnblogs.com/luhe/p/4155612.html

sum(x) over( partition by y ORDER BY z ) 分析

之前用过row_number(),rank()等排序与over( partition by ... ORDER BY ...),这两个比较好理解: 先分组,然后在组内排名。

今天突然碰到sum(...) over( partition by ... ORDER BY ... ),居然搞不清除怎么执行的,所以查了些资料,做了下实操。

1. 从最简单的开始

  sum(...) over( ),对所有行求和

  sum(...) over( order by ... ),和 =  第一行 到 与当前行同序号行的最后一行的所有值求和,文字不太好理解,请看下图的算法解析。

复制代码
with aa as ( SELECT 1 a,1 b, 3 c FROM dual union SELECT 2 a,2 b, 3 c FROM dual union SELECT 3 a,3 b, 3 c FROM dual union SELECT 4 a,4 b, 3 c FROM dual union SELECT 5 a,5 b, 3 c FROM dual union SELECT 6 a,5 b, 3 c FROM dual union SELECT 7 a,2 b, 3 c FROM dual union SELECT 8 a,2 b, 8 c FROM dual union SELECT 9 a,3 b, 3 c FROM dual
) SELECT a,b,c, sum(c) over(order by b) sum1,--有排序,求和当前行所在顺序号的C列所有值 sum(c) over() sum2 FROM aa;--无排序,求和 C列所有值
复制代码

2. 与 partition by 结合

  sum(...) over( partition by... ),同组内所行求和

  sum(...) over( partition by... order by ... ),同第1点中的排序求和原理,只是范围限制在组内

复制代码
with aa as ( SELECT 1 a,1 b, 3 c FROM dual union SELECT 2 a,2 b, 3 c FROM dual union SELECT 3 a,3 b, 3 c FROM dual union SELECT 4 a,4 b, 3 c FROM dual union SELECT 5 a,5 b, 3 c FROM dual union SELECT 6 a,5 b, 3 c FROM dual union SELECT 7 a,2 b, 3 c FROM dual union SELECT 7 a,2 b, 8 c FROM dual union SELECT 9 a,3 b, 3 c FROM dual
) SELECT a,b,c,sum(c) over( partition by b ) partition_sum, sum(c) over( partition by b order by a desc) partition_order_sum FROM aa;
复制代码

  



本文來源于http://www.cnblogs.com/luhe/p/4155612.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30220976/viewspace-1653916/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-04-24

  • 博文量
    34
  • 访问量
    106206