多维分析——grouping set
场景
在编写报表的 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相关推荐
- hive 多维分析 GROUPING SETS
GROUPING SETS 1.含义: GROUPING SETS 允许在一个数据结果集中包含多个 GROUP BY 结果集,即进行多维分析. GROUPING SET 可由 UNION 连接的几个 ...
- Oracle业务适合用PostgreSQL去O的一些评判标准
标签 PostgreSQL , Oracle 背景 Oracle业务适合用PG去O的一些评判标准: 功能指标 如果评估出来的业务中具备这些特性,非常适合使用PostgreSQL. 1.业务使用的数据类 ...
- Hive常用函数(日期函数,取整函数,字符串操作函数,集合操作函数)
常用函数 常用日期函数 常用取整函数 常用字符串操作函数 集合操作函数 多维分析 常用日期函数 unix_timestamp:返回当前或指定时间的时间戳 select unix_timestamp() ...
- mysql grouping sets_Spark--Spark多维分析cube/rollup/grouping sets/group by
概念简述 group by:主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录.可以添加聚合函数. grouping sets:对分组集中指定的组表达式的每个子集执行group ...
- tp5某个字段相同的数据只取一次_多维分析数据仓库建设建议-面向主题的建模...
数仓使用数据库构建 数仓的作用简单来说就是存储数据和读取数据. 绝大部分情况下,数据是结构化的,因此存储数据使用数据库,使用SQL语言进行数据处理. 多维分析 多维分析是指使用数据的场景,查询时组合维 ...
- olap 多维分析_如何通过依赖T-SQL从OLAP多维数据集有效地提取数据
olap 多维分析 介绍 (Introduction) Last month I ran two Business Intelligence pre-conferences in South Afri ...
- Spark 多维分析
grouping sets / with cube / with rollup 多维分析问题 Spark SQL 的 GROUP BY 子句 | Spark SQL 教程 - 盖若 https:// ...
- Hive中的多维分析函数
Hive中的多维分析函数 众所周知,Hive是一个OLAP数据库,拥有着很强大的数据分析能力. 但是当我们一张表的维度信息特别多,并且需要各种维度组合的统计分析结果时就很不方便.比如一张表有5个维度, ...
- Flink在快手实时多维分析场景的应用
导读:作为短视频分享跟直播的平台,快手有诸多业务场景应用了 Flink,包括短视频.直播的质量监控.用户增长分析.实时数据处理.直播 CDN 调度等.此次主要介绍在快手使用 Flink 在实时多维分析 ...
最新文章
- 腹式肠道操 缩胃瘦身有奇效 - 健康程序员,至尚生活!
- MGM Resorts和NRG Energy在美国完成最大屋顶光伏阵列的安装
- Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案
- 单一职责在.NET中
- UVA 11557 - Code Theft (KMP + HASH)
- java 股票 代码_Java中利用散列表实现股票行情的查询_java
- 谈一谈Java编程开发中虚拟机的内存区域划分?猿们怎么看?
- leetcode 123. 买卖股票的最佳时机 III
- 白帽子讲web安全——访问控制
- 【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(7)
- js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...
- Android LiveData组件分析
- 本博客自排名300到264的各项数据变化
- 字典哈希表的实现原理_字典哈希表的实现原理
- maya mentray_mental ray渲染器下载
- 计算机应用基础实操题怎么操,计算机基础实操试题
- 计算机技术和教育,计算机技术和现代数学教育
- 无锡梅里旅游策划方案——中国第一锡宫!
- 一个我记了十几年的BUG
- SkyEye硬件模拟平台