场景

在编写报表的 sql 脚本的时候,可能会遇到多维度组合的情况,例如下面的情况。

- 省 城市 区 人口数量- 省 城市 区 街道 人口数量

常规做法

上面据的例子中,既要汇总出省、城市、区的人口,也要汇总出省、城市、区、街道的人口。常规的做法是编写两种维度组合的 sql ,然后再使用 union all 进行全集。
类似下面的写法:

 select  province, city, region, '-' as street, sum(population_quantity)from population
group by province, city, region
union all select  province, city, region, street, sum(population_quantity)from population
group by province, city, region, street

grouping set 的解决方法

 select  province, city, region, street, sum(population_quantity)from population
group by province, city, region, street
grouping sets((province,city,region),(province,city,region,street))

呵呵,我坦白,我写的不一定对,你要在自己的机子上试试,否则错,就浪费时间了。

那么问题了来,我怎么知道哪些行是统计到省、城市、区,哪些行是统计到省、城市、区、街道的。这时候就要请我们的 Grouping__ID 闪亮登场了。那么我们的 sql 也要改成如下的样子:

 select  province, city, region, street, Grouping__ID as group_id, sum(population_quantity)from population
group by province, city, region, street
grouping sets((province,city,region),(province,city,region,street))

Grouping__ID 是 hive 帮我们生成的,标识维度组合的十进制数字。那么它的生成规则是怎样的呢?

以上面的例子说明 Grouping__ID 的生成规则:
group by 后面有四个字段,在 grouping sets 的组合中存在的字段使用 1 表示,否则使用 0 表示。
grouping sets 中有两组字段组合,分别是:
province,city,region:1 1 1 0 换算成十进制为 14
province,city,region,street:1 1 1 1 换算成十进制为 15
Grouping__ID 就是最后生成的十进制数字。

发现了这个规律后,我们应该更进一步,利用算法,让 sql 帮我计算出十进制代表了那些维度组合。

我们知道二进制的并运算,例如,1 0 0 0 & x ,其中 x 是任意一个四位二进制数字,经过并运算,我们得到一个 y ,如何 y = 8 ,那说明 x 的第四数是 1 ,如果 y 是 0 ,那说明 x 的第四位数是 0。根据这一原理,我们就能判断出 Grouping__ID 代表的维度组合中有那些字段了。

例如,我们得到一个结果表,population_sum。

select concat(   if(group_id & (1<<0) = (1<<0) ) , 'province', ''),'-', if(group_id & (1<<1) = (1<<1) ) , 'city', ''),'-', if(group_id & (1<<2) = (1<<2) ) , 'region', ''),'-', if(group_id & (1<<3) = (1<<3) ) , 'street', '')               )  as dim_group -- 维度组合 from population_sum

上面的 sql 语句是 mysql 上运行的,如果你所在的平台(例如,presto)没有&和为运算,那改怎么办呢?这里介绍一下,我想出来的一个办法,在每一个符合 sql 标准的数据平台中,应该都会支持指数运算和取余运算,例如,8 是的二进制是 1000, 8/2=4,二
进制为 100,8/8=1,二进制是1。通过上面的例子,可以看出,除 2 相当于向右进行位运算,如果一个二进制数对应的十进制数除以 2 的 n - 1 次方,则可以将这个二进制的数的第 n 位放到对应 10 进制数的各位,然后进行取余运算,如果结果是 0 ,则第 N 位是 0 ,否则为 1 。

select concat(if(mod(from_base('1001',2)/cast(pow(2,0) as bigint),2) = 1 ,'biz_date' ,'') ,',',if(mod(from_base('1000',2)/cast(pow(2,2) as bigint),2) =1 ,'month_code' ,''))

也可以使用 from_base(‘1100’,2) -> 12 自己算一下 groupping 的值等于几

大概就是这样吧。我也不知道我写的到底对不对,各位看官,看懂了,还要自己测试一下。

多维分析——grouping set相关推荐

  1. hive 多维分析 GROUPING SETS

    GROUPING SETS 1.含义: GROUPING SETS 允许在一个数据结果集中包含多个 GROUP BY 结果集,即进行多维分析. GROUPING SET 可由 UNION 连接的几个 ...

  2. Oracle业务适合用PostgreSQL去O的一些评判标准

    标签 PostgreSQL , Oracle 背景 Oracle业务适合用PG去O的一些评判标准: 功能指标 如果评估出来的业务中具备这些特性,非常适合使用PostgreSQL. 1.业务使用的数据类 ...

  3. Hive常用函数(日期函数,取整函数,字符串操作函数,集合操作函数)

    常用函数 常用日期函数 常用取整函数 常用字符串操作函数 集合操作函数 多维分析 常用日期函数 unix_timestamp:返回当前或指定时间的时间戳 select unix_timestamp() ...

  4. mysql grouping sets_Spark--Spark多维分析cube/rollup/grouping sets/group by

    概念简述 group by:主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录.可以添加聚合函数. grouping sets:对分组集中指定的组表达式的每个子集执行group ...

  5. tp5某个字段相同的数据只取一次_多维分析数据仓库建设建议-面向主题的建模...

    数仓使用数据库构建 数仓的作用简单来说就是存储数据和读取数据. 绝大部分情况下,数据是结构化的,因此存储数据使用数据库,使用SQL语言进行数据处理. 多维分析 多维分析是指使用数据的场景,查询时组合维 ...

  6. olap 多维分析_如何通过依赖T-SQL从OLAP多维数据集有效地提取数据

    olap 多维分析 介绍 (Introduction) Last month I ran two Business Intelligence pre-conferences in South Afri ...

  7. Spark 多维分析

    grouping sets / with cube / with rollup  多维分析问题 Spark SQL 的 GROUP BY 子句 | Spark SQL 教程 - 盖若 https:// ...

  8. Hive中的多维分析函数

    Hive中的多维分析函数 众所周知,Hive是一个OLAP数据库,拥有着很强大的数据分析能力. 但是当我们一张表的维度信息特别多,并且需要各种维度组合的统计分析结果时就很不方便.比如一张表有5个维度, ...

  9. Flink在快手实时多维分析场景的应用

    导读:作为短视频分享跟直播的平台,快手有诸多业务场景应用了 Flink,包括短视频.直播的质量监控.用户增长分析.实时数据处理.直播 CDN 调度等.此次主要介绍在快手使用 Flink 在实时多维分析 ...

最新文章

  1. 腹式肠道操 缩胃瘦身有奇效 - 健康程序员,至尚生活!
  2. MGM Resorts和NRG Energy在美国完成最大屋顶光伏阵列的安装
  3. Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案
  4. 单一职责在.NET中
  5. UVA 11557 - Code Theft (KMP + HASH)
  6. java 股票 代码_Java中利用散列表实现股票行情的查询_java
  7. 谈一谈Java编程开发中虚拟机的内存区域划分?猿们怎么看?
  8. leetcode 123. 买卖股票的最佳时机 III
  9. 白帽子讲web安全——访问控制
  10. 【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(7)
  11. js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...
  12. Android LiveData组件分析
  13. 本博客自排名300到264的各项数据变化
  14. 字典哈希表的实现原理_字典哈希表的实现原理
  15. maya mentray_mental ray渲染器下载
  16. 计算机应用基础实操题怎么操,计算机基础实操试题
  17. 计算机技术和教育,计算机技术和现代数学教育
  18. 无锡梅里旅游策划方案——中国第一锡宫!
  19. 一个我记了十几年的BUG
  20. SkyEye硬件模拟平台

热门文章

  1. 尚医通 (十九)用户认证
  2. 计算机图形学结课论文,计算机图形学结课论文
  3. java的方式实现腾讯云ocr名片识别功能
  4. i.MX6ULL终结者Linux RS232/485驱动实验i.MX6UL UART驱动分析
  5. 事务标识(xid)解析
  6. SpringCloud之微服务应用监控
  7. 达梦8数据库dm8集群部署之DW集群Linux(主备自切)
  8. LeapMotion使用范围
  9. Thymeleaf中th:eachth:if的用法解析
  10. GitLab提交代码SSL证书过期解决