oracle分析函数——rollup和cube
来源:互联网 发布:eve捏脸数据导入 编辑:程序博客网 时间:2024/05/29 08:54
原文见我得博客:http://lanjingling.github.io/2015/10/09/oracle-fenxihanshu-1/
1、rollup介绍:
group by后带rollup子句的功能可以理解为:先按一定的规则产生多种分组,然后按各种分组统计数据。(至于统计出的数据是求和还是最大值还是平均值等这就取决于SELECT后的聚合函数)。oracle中rollup和mysql的差不多,但比mysql的强大(mysql只有下面的第1和第2使用方式),且oracle中rollup可以和order by一起使用。具体使用如下:
1)对比没有带rollup的goup by:
Group by A,B产生的分组种数:1种;
- group by A,B
返回结果集:也就是这一种分组的结果集。
2)带rollup但group by与rollup之间没有任何内容:
A、Group by rollup(A ,B) 产生的分组种数:3种;
- 第一种:group by A,B
- 第二种:group by A
- 第三种:group by NULL
返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。
B、Group by rollup(A ,B,C) 产生的分组种数:4种;
- 第一种:group by A,B,C
- 第二种:group by A,B
- 第三种:group by A
- 第四种:group by NULL
返回结果集:为以上四种分组统计结果集的并集且未去掉重复数据。
3)带rollup但groupby与rollup之间还包含有列信息
A、Group by A , rollup(A ,B) 产生的分组种数:3种;
- 第一种:group by A,A,B 等价于group by A,B
- 第二种:group by A,A 等价于group by A
- 第三种:group by A,NULL 等价于group by A
返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。
B、Group by C , rollup(A ,B) 产生的分组种数:3种;
- 第一种:group by C,A,B
- 第二种:group by C,A
- 第三种:group by C,NULL 等价于group by C
返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。
4)带rollup且rollup子句括号内又使用括号对列进行组合
A、Group by rollup((A ,B)) 产生的分组种数:2种;
- 第一种:group by A,B
- 第二种:group by NULL
返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。
B、Group by rollup(A ,(B,C)) 产生的分组种数:3种;
- 第一种:group by A,B,C
- 第二种:group by A
- 第三种:group by NULL
返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。
注:对这种情况,可以理解为几个列被括号括在一起时,就只能被看成一个整体,分组时不需要再细化。因此也可推断rollup括号内也顶多加到一重括号,加多重了应该没有任何意义(这个推断我没有做验证的哦)。
2、与rollup组合使用的其它几个辅助函数:
1)grouping()函数:
必须接受一列且只能接受一列做为其参数。参数列值为空返回1,参数列值非空返回0。(如果参数的列在rollup中,则返回1;否则返回0)
2)grouping_id()函数:
必须接受一列或多列做为其参数。返回值为按参数排列顺序,依次对各个参数使用grouping()函数,并将结果值依次串成一串二进制数然后再转化为十进制所得到的值。
例如:grouping(A) = 0 ;grouping(B) = 1;
则:grouping_id(A,B) = (01)2 = 1;
grouping_id(B,A)= (10)2 =2;
3)group_id()函数
调用时不需要且不能传入任何参数。返回值为某个特定的分组出现的重复次数(第一大点中的第3种情况中往往会产生重复的分组)。重复次数从0开始,例如某个分组第一次出现则返回值为0,第二次出现时返回值为1,……,第n次出现返回值为n-1。
注:使用以上三个函数往往是为了过滤掉一部分统计数据,而达到美化统计结果的作用。
3、cube和rollup区别:
带cube子句的groupby会产生更多的分组统计数据。cube后的列有多少种组合(注意组合是与顺序无关的)就会有多少种分组。
1)假设有n个维度,rollup会有n个聚合:
rollup(a,b) 统计列包含:(a,b)、(a)、()
rollup(a,b,c)统计列包含:(a,b,c)、(a,b)、(a)、()
……以此类推ing……
2)假设有n个纬度,cube会有2的n次方个聚合:
cube(a,b) 统计列包含:(a,b)、(a)、(b)、()
cube(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()
……以此类推ing……
原文见我得博客:http://lanjingling.github.io/2015/10/09/oracle-fenxihanshu-1/
- oracle分析函数——rollup和cube
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数八——CUBE,ROLLUP
- Oracle分析函数八——CUBE,ROLLUP
- oracle rollup和cube分析
- oracle rollup和cube分析
- ORACLE ROLLUP和CUBE函数
- oracle分析函数系列之ROLLUP和CUBE
- Oracle select --分析函数cube(),rollup()
- oracle 分析函数 之 rollup,cube
- oracle rollup,cube函数
- oracle rollup和cube
- Oracle ROLLUP 和 CUBE
- oracle分组函数rollup,cube
- oracle提供的分析函数 cube(),rollup(),grouping sets()
- Oracle ROLLUP和CUBE 用法
- Oracle rollup和cube区别
- Android 5.0 API新增和改进
- C++中vector使用详细说明
- 苹果支持电话
- C++接口实现总结 http://qimo601.iteye.com/blog/1393427
- C++引用与指针的比较
- oracle分析函数——rollup和cube
- void及void指针含义的深刻解析
- C++的强制类型转化
- 在Ubuntu下,关于vim的配置
- mysql的性能查询相关
- 关于 HTTP GET/POST 请求参数长度最大值的一个理解误区
- 解析虚拟VMware三种网络模式的根本区别
- VM虚拟机上网问题详解
- 容器适配器