专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

Oracle数据立方体多维数据用CUBE处理

ins518 2024-11-11 13:42:17 技术文章 11 ℃ 0 评论

一、简介:

Oracle的数据立方,在数据仓库处理多维数据是很常用的功能,大大的减少了group 的工作量。

数据立方的具体概念,可以参考百度百科:

可以参考「链接」

数据立方(DataCube)是一种用于数据分析与索引的技术架构。它是针对大数据(big data)的处理器,可以对元数据进行任意多关键字实时索引。通过数据立方对元数据进行分析之后,可以大大加快数据的查询和检索效率。

数据立方是凌驾于数据存储层和数据库系统之上的,通过数据立方解析后,可以大大增加数据查询和检索等业务,可以让系统平台具备数据实时入库、实时查询、查询结果实时传输等优势。

Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。

如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。


如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。

grouping_id()可以美化效果:

Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。


二、示例演练

1)创建测试表


create table tab_objects as select * from dba_objects;

使用聚合函数,分组group by 查看结果


使用Oracle的多维功能,ROLLUP和CUBE语句的执行结果


select owner,object_type ,count(1) as ct from tab_objects group by rollup(owner,object_type);


发现多了一个汇总合计值。

group by rollup(col1,col2,col3) 常用来报表的合计。


select owner,object_type ,count(1) as ct from tab_objects group by cube(owner,object_type);

看不出是什么?

我们增加一个grouping


Select grouping(owner) as gid1,grouping(object_type) as gid2, owner,object_type ,count(1) as ct from tab_objects group by cube(owner,object_type);


发现gid1是1,gid2是1 ,代表没有选择owner,object_type,直接汇总的行计数

Gid1=1,gid2=0 代表没有选择owner,选择了object_type,做的分组汇总

以此类推,总结,cube是对字段的任意组合,排序。

1 代表 没有选择该字段

0 代表 选择了该字段


也就是说,如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。


和ROLLUP相比,CUBE又增加了对STATUS列的GROUP BY统计。


如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。


除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY结果。


Select grouping_id(owner,object_type) as gpid,grouping(owner) as gid1,grouping(object_type) as gid2, owner,object_type ,count(1) as ct from tab_objects group by cube(owner,object_type);

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表