数据湖 多维数据集_按汇总分组/多维数据集

数据湖 多维数据集

时不时地,您会遇到一个使您达到SQL限制的要求。 我们中的许多人可能会早早放弃并使用Java / [或您的语言]计算内容。 相反,使用SQL可能是如此简单快捷。 如果您使用的是高级数据库,例如DB2 , Oracle , SQL Server , Sybase SQL Anywhere (以及本例中的MySQL ,它们支持WITH ROLLUP子句),则可以利用ROLLUP / CUBE / GROUPING SETS分组功能。

让我们看一下我的虚拟薪水与一个虚构的朋友的薪水比较,后者选择了不同的职业道路(观察2011年的薪水增长情况):

select 'Lukas'      as employee, 'SoftSkills' as company, 80000        as salary, 2007         as year from dualunion all select 'Lukas', 'SoftSkills', 80000,  2008 from dualunion all select 'Lukas', 'SmartSoft',  90000,  2009 from dualunion all select 'Lukas', 'SmartSoft',  95000,  2010 from dualunion all select 'Lukas', 'jOOQ',       200000, 2011 from dualunion all select 'Lukas', 'jOOQ',       250000, 2012 from dualunion all select 'Tom',   'SoftSkills', 89000,  2007 from dualunion all select 'Tom',   'SoftSkills', 90000,  2008 from dualunion all select 'Tom',   'SoftSkills', 91000,  2009 from dualunion all select 'Tom',   'SmartSoft',  92000,  2010 from dualunion all select 'Tom',   'SmartSoft',  93000,  2011 from dualunion all select 'Tom',   'SmartSoft',  94000,  2012 from dual

现在,我们习惯于使用简单的分组和简单的聚合函数来收集统计信息。 例如,让我们计算一下卢卡斯和汤姆在过去几年中的平均收入:

with data as ([above select])select employee, avg(salary)from datagroup by employee

这将表明Lukas赚了更多:

+--------+-----------+
|EMPLOYEE|AVG(SALARY)|
+--------+-----------+
|Lukas   |     132500|
|Tom     |      91500|
+--------+-----------+

因此,找出他们在哪家公司的平均收入可能很有趣:

with data as (...)select company, employee, avg(salary)from datagroup by company, employeeorder by company, employee

随即,很明显,大笔钱在哪里,汤姆做出了一个错误的决定。 ;-)

+----------+--------+-----------+
|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----------+--------+-----------+
|jOOQ      |Lukas   |     225000|
|SmartSoft |Lukas   |      92500|
|SmartSoft |Tom     |      93000|
|SoftSkills|Lukas   |      80000|
|SoftSkills|Tom     |      90000|
+----------+--------+-----------+

卷起

通过添加分组字段,我们“丢失”了一些聚合信息。 在以上示例中,不再直接从结果中获得每位员工的总体平均工资。 考虑到分组算法,这很明显。 但是在美观的报告中,我们通常也希望显示这些分组标题。 这是ROLLUP,CUBE(和GROUPING SETS)起作用的地方。 考虑以下查询:

with data as (...)select company, employee, avg(salary)from datagroup by rollup(company), employee

上面的汇总功能现在将向分组结果集中添加其他行,并保留有用的汇总值。 在这种情况下,当我们“汇总公司的薪水”时,我们将获得剩余分组字段的平均值,即每位员工的平均值:

+----------+--------+-----------+
|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----------+--------+-----------+
|SmartSoft |Tom     |      93000|
|SoftSkills|Tom     |      90000|
|{null}    |Tom     |      91500|
|jOOQ      |Lukas   |     225000|
|SmartSoft |Lukas   |      92500|
|SoftSkills|Lukas   |      80000|
|{null}    |Lukas   |     132500|
+----------+--------+-----------+

请注意,这些行与第一个查询所保存的信息是如何相同的,在第一个查询中,我们仅按员工分组……当我们将更多分组字段放入汇总功能时,这变得更加有趣:

with data as (...)select company, employee, avg(salary)from datagroup by rollup(employee, company)

如您所见,分组字段的顺序在汇总功能中很重要。 现在,此查询的结果还将添加支付给所有公司中所有员工的总体平均工资

+----------+--------+-----------+
|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----------+--------+-----------+
|SmartSoft |Tom     |      93000|
|SoftSkills|Tom     |      90000|
|{null}    |Tom     |      91500|
|jOOQ      |Lukas   |     225000|
|SmartSoft |Lukas   |      92500|
|SoftSkills|Lukas   |      80000|
|{null}    |Lukas   |     132500|
|{null}    |{null}  |     112000|
+----------+--------+-----------+

为了标识要报告的总计行,可以在DB2,Oracle,SQL Server和Sybase SQL Anywhere中使用GROUPING()函数。 在Oracle和SQL Server中,还有更有用的GROUPING_ID()函数:

with data as (...)select grouping_id(employee, company) id, company, employee, avg(salary)from datagroup by rollup(employee, company)

它记录了当前行产生在汇总功能的哪个“分组级别”上:

+----+----------+--------+-----------+
|  ID|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----+----------+--------+-----------+
|   0|SmartSoft |Tom     |      93000|
|   0|SoftSkills|Tom     |      90000|
|   1|{null}    |Tom     |      91500|
|   0|jOOQ      |Lukas   |     225000|
|   0|SmartSoft |Lukas   |      92500|
|   0|SoftSkills|Lukas   |      80000|
|   1|{null}    |Lukas   |     132500|
|   3|{null}    |{null}  |     112000|
+----+----------+--------+-----------+

立方体

多维数据集功能的工作原理类似,只是多维数据集分组字段的顺序变得无关紧要,因为所有分组组合都已合并。 说起来有点棘手,所以让它付诸实践:

with data as (...)select grouping_id(employee, company) id, company, employee, avg(salary)from datagroup by cube(employee, company)

在以下结果中,您将获得:

  • GROUPING_ID()= 0:每个公司和每个员工的平均值。 这是正常的分组结果
  • GROUPING_ID()= 1:每位员工的平均值
  • GROUPING_ID()= 2:每个公司的平均值
  • GROUPING_ID()= 3:总体平均
+----+----------+--------+-----------+
|  ID|COMPANY   |EMPLOYEE|AVG(SALARY)|
+----+----------+--------+-----------+
|   3|{null}    |{null}  |     112000|
|   2|jOOQ      |{null}  |     225000|
|   2|SmartSoft |{null}  |      92800|
|   2|SoftSkills|{null}  |      86000|
|   1|{null}    |Tom     |      91500|
|   0|SmartSoft |Tom     |      93000|
|   0|SoftSkills|Tom     |      90000|
|   1|{null}    |Lukas   |     132500|
|   0|jOOQ      |Lukas   |     225000|
|   0|SmartSoft |Lukas   |      92500|
|   0|SoftSkills|Lukas   |      80000|
+----+----------+--------+-----------+

换句话说,使用CUBE()函数,您将获得提供给CUBE()函数的分组字段的每种可能组合的分组结果,这将为n个“立方”分组字段产生2 ^ n GROUPING_ID()

jOOQ中的支持

jOOQ 2.0引入了对这些功能的支持。 如果要将最后一个选择转换为jOOQ,则可以大致得到以下Java代码:

// assuming that DATA is an actual table...create.select(groupingId(DATA.EMPLOYEE, DATA.COMPANY).as("id"),DATA.COMPANY, DATA.EMPLOYEE, avg(SALARY)).from(DATA).groupBy(cube(DATA.EMPLOYEE, DATA.COMPANY));

有了这个功能强大的工具,您就可以准备好所有这些精美的报告和数据概述。 有关更多详细信息,请在SQL Server文档页面上继续阅读有关ROLLUP(),CUBE()和GROUPING SETS()函数的信息,其中对此进行了很好的解释:
http://msdn.microsoft.com/en-us/library/bb522495.aspx

参考:来自JAVA,SQL和JOOQ博客的JCG合作伙伴 Lukas Eder的GROUP BY ROLLUP / CUBE 。

相关文章 :

  • Java中的数据库架构导航
  • ORM问题
  • SQL或NOSQL:这是问题吗?
  • 什么是NoSQL?

翻译自: https://www.javacodegeeks.com/2011/12/group-by-rollup-cube.html

数据湖 多维数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FlexyPool如何同时支持连接代理和装饰器

代理人 FlexyPool监视连接池使用情况,因此需要拦截连接关闭方法调用。 为了简单起见,第一个版本为此目的依赖动态代理: private static class ConnectionInvocationHandler implements InvocationHandler {public static final String CLOS…

集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍...

1 创建集合视图,设置相关属性以满足要求 1.1 问题 集合视图控制器UIConllectionViewController是一个展示大量数据的控制器,系统默认管理着一个集合视图UICollectionView,功能几乎和UITableViewController差不多,能够以多行多列的…

【APICloud系列|24】 MNNavigationMenu模块(导航菜单)的实现

导读:MNNavigationMenu 是一个导航栏菜单,开发者可自定义其中的样式和按钮个数,超出屏幕部分可左右拖动查看。 模块详情:http://www.apicloud.com/mod_detail/12417 index.html <!doctype html> <html> <head><meta charset="utf-8">&…

mysql2教程_mySQL 教程 第2章 安装和介绍mySQL

设置mySQL字符集支持中文的字符集是utf8&#xff0c;该设置可以更改mySQL配置文件进行全局设置&#xff0c;也可以针对数据库设置&#xff0c;也可以针对表设置&#xff0c;也可以针对列设置。字符集更改后新插入的数据生效&#xff0c;对以前不生效。练习1&#xff1a;更改MyS…

java 更新订单状态_Java 8状态更新

java 更新订单状态即将到来的Java SE 8发行版的两大新语言功能是Lambda Expressions和Modularity。 这两天的状态更新都已经发布。 我会与您分享链接&#xff0c;因此您可能会在假期中通读它们 Oracle计划在2013年中期发布Java SE 8。 Lambda项目 Lambda项目以及JSR-335希望提…

基于JBoss Fuse 6.2的JBoss BPM微服务集成指南

今年年初&#xff0c;我们宣布了JBoss BPM Suite令人兴奋的示例项目&#xff0c;该项目围绕一个正在运行的在线Travel Agency项目展开。 最初是利用Web服务&#xff0c;后来我们在JBoss Fuse的帮助下迁移到微服务 。 随着JBoss Fuse 6.2的发布&#xff0c;我们希望重新访问该…

mysql zip 还原_mysql 压缩还原数据库

MySQL数据库备份和还原的常用命令其实很多情况下mysql备份就是采用了这些命令&#xff0c;例如&#xff1a;mysql导入和导出数据linux自动定时备份web程序和mysql数据库备份MySQL数据库的命令mysqldump -hhostname -uusername -ppassword databasename > backup...文章无声胜…

jvm调试工具_调试JVM

jvm调试工具在某些&#xff08;极少数&#xff09;情况下&#xff0c;您可能会遇到使JVM本身崩溃的情况。 我最近通过将ThreadGroup的名称设置为null来进行管理 。 在这些情况下&#xff0c;调试JVM本身很有用&#xff0c;这样可以更精确地定位崩溃。 这是执行此操作的步骤&…

遮罩窗体弹出登录页面代码实现

先上效果图(本人喜欢胡巴&#xff0c;背景用了胡巴)&#xff0c;鼠标滑过页面&#xff0c;图片变暗&#xff0c;透明度为0.4&#xff0c;同时弹出登录窗口。 接下来先看css代码(写的可能不是很规范&#xff0c;根据调整样式顺序写的) body{background-color: black;width: 100%…

【APICloud系列|27】 UICalendar模块(日历)的实现

导读:UICalendar 是一个日历选择模块;可自定义日历的样式,添加特殊日期标注,切换月份,设置指定日期;用于实现常用的日期选择,日历展示功能 模块地址 UICalendar 是一个日历选择模块;可自定义日历的样式,添加特殊日期标注,切换月份,设置指定日期;用于实现常用的日期…

使用Camel从WildFly 8向WebLogic 12发送JMS消息

系统集成是一个很好的挑战。 特别是当您在寻找通信标准和可靠的解决方案时。 在当今的微服务世界中&#xff0c;每个人都在谈论REST服务和基于http的协议。 实际上&#xff0c;对于大多数企业项目来说&#xff0c;这往往是远远不够的&#xff0c;而这些项目通常具有更复杂的要求…

【APICloud系列|28】 UIChatBox 模块(聊天输入框)的实现

导读:UIChatBox 模块是一个聊天输入框模块,开发者可自定义该输入框的功能 项目结构: config.xml <?xml version="1.0" encoding="UTF-8"?><widget id="A6909001303255" version="0.0.1"> <name>UIChatbox<…

mysql索引参数_MySQL索引介绍

索引由数据库表中一列或者多列组合而成&#xff0c;其作用是提高对表中数据的查询速度。创建索引是指在某个表的一列或者多列上建立一个索引&#xff0c;用来提高对表的访问速度&#xff0c;创建索引由三种方法&#xff1a;在创建表的时候创建&#xff0c;在已存在的表上创建和…

【APICloud系列|31】百度导航功能的实现

导读:百度导航基础功能。d用到了bMap模块,baiduNavigation模块,UIListView模块。样式完全来自AUI。js用到了zepto.j 效果图: 项目结构: index.html <!doctype html> <html> <head><meta charset="utf-8"><meta name="viewport…

osgi简介_OSGi:简介

osgi简介为基于Java的系统创建的OSGi提供了模块化系统的框架。 OSGi使得可以定义每个单独模块与其他模块的依赖关系&#xff0c;并使用户能够控制生命周期并动态更改系统的每个组件。 OSGi是一个规范&#xff0c;最常见的实现可以算作Equinox &#xff0c; Apache Felix和Knopl…

GC基本算法及C++GC机制

前言 垃圾收集器是一种动态存储分配器&#xff0c;它自动释放程序不再需要的已分配的块&#xff0c;这些块也称为垃圾。在程序员看来&#xff0c;垃圾就是不再被引用的对象。自动回收垃圾的过程则称为垃圾收集&#xff08;garbage collection&#xff09;。在一个支持垃圾收集的…

【APICloud系列|32】 aMapNavigation高德地图导航的实现

导读:aMapNavigation 模块封装了高德导航的sdk,支持语音导航功能。用户可自行算路策略类型。开发者只需输入起点终点经纬度即可轻松集成高德导航功能,本模块是由第三方模块开发者提供,使用本模块需在线云编译安装包。 效果图: 项目结构: index.html <!doctype html&…

JDK 9早期版本安装后的Windows注册表清理

在我的上一篇博文中 &#xff0c;我演示了在安装早期版本的JDK 9&#xff08;内部版本68&#xff09;之后围绕Oracle Java符号链接 &#xff08;基于Windows的计算机上的C:\ProgramData\Oracle\Java\javapath\目录&#xff09;的问题的解决方案。这似乎阻止了早期&#xff08;更…

java实现网上招标系统

导读:本设计尝试用JSP在网络上架构一个下沙派威客网,以推进网站无纸化,过程电子化,管理智能化的发展。本文从理论和实践两个角度出发,对一个具有数据分析功能的下沙派威客网进行设计与实现分析。论文首先较为详尽地介绍了面向对象分析与设计的有关概念与技术,特别深入介绍…

java实现俄罗斯方块项目

导读:俄罗斯方块项目,基本功能包括:游戏主界面显示模块、方块及数据显示模块、方块移动控制模块、游戏界面颜色控制模块、游戏进度、等级控制模块等。本项目结构如下: (1)游戏主界面显示模块: 显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布…