汽车门户网站 源码,网站如何推广引流,怎么做示爱的网站,网站怎么做mip技术数据湖 多维数据集时不时地#xff0c;您会遇到一个使您达到SQL限制的要求。 我们中的许多人可能会早早放弃并使用Java / [或您的语言]计算内容。 相反#xff0c;使用SQL可能是如此简单快捷。 如果您使用的是高级数据库#xff0c;例如DB2 #xff0c; Oracle #xff0c… 数据湖 多维数据集 时不时地您会遇到一个使您达到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|
-----------------------------卷起 通过添加分组字段我们“丢失”了一些聚合信息。 在以上示例中不再直接从结果中获得每位员工的总体平均工资。 考虑到分组算法这很明显。 但是在美观的报告中我们通常也希望显示这些分组标题。 这是ROLLUPCUBE和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|
----------------------------- 为了标识要报告的总计行可以在DB2OracleSQL 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文档页面上继续阅读有关ROLLUPCUBE和GROUPING SETS函数的信息其中对此进行了很好的解释 http://msdn.microsoft.com/en-us/library/bb522495.aspx 参考来自JAVASQL和JOOQ博客的JCG合作伙伴 Lukas Eder的GROUP BY ROLLUP / CUBE 。 相关文章 Java中的数据库架构导航 ORM问题 SQL或NOSQL这是问题吗 什么是NoSQL 翻译自: https://www.javacodegeeks.com/2011/12/group-by-rollup-cube.html数据湖 多维数据集