• hive 不同维度聚合 grouping sets 使用详情


    当结构数据表中,多列维度字段场景,
    需要看不同维度聚合后的数据集时。

    整体 demo sql

    select	
    			if(CAST (GROUPING__ID AS INT) & 8=0, A, 'all') as A
    			,if(CAST (GROUPING__ID AS INT) & 4=0, B, 'all') as B
    			,C
    			,D
    from table_name
    where dt = '${dt}'
    group by
    			A
    			,B
    			,C
    			,D	
    GROUPING SETS(
    			(A)		
    			,(B)
    			,(C)	
    			,(D)	
    			
    			,(A,B)	
    			,(A,C)
    			,(A,D)
    			,(B,C)	
    			,(B,D)	
    			,(C,D)	
    			
    			,(A,B,C)	
    			,(A,B,D)	
    			,(A,C,D)	
    			,(B,C,D)	
    			
    			,(A,B,C,D)	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    下面进行sql逐步拆解分析(建议三个模块结合着看,会更快理解该语法)

    1.第一模块

    select	
    			-- A 的二进制为 8 ,如果 GROUPING__ID & 8=0 则取A值,否值为 all 
    			if(CAST (GROUPING__ID AS INT) & 8=0, A, 'all') as A
    			
    			-- & 运算符使用
    			--	0	1	1	1	二进制数对应的十进制数为	7
    			--	1	0	0	0	二进制数对应的十进制数为	8
    			--	演示 7 & 8(1表示 真 、0表示 假;真真得真,真假得假,假假得假)
    			--	0	1	1	1
    			--	1	0	0	0
    			-----------------
    			--	0	0	0	0	该二进制对应的十进制为0
    			-- 则 7 & 8 =0
    			
    			
    			-- A 的二进制为 4 ,如果 GROUPING__ID & 4=0 则取B值,否值为 all 
    			,if(CAST (GROUPING__ID AS INT) & 4=0, B, 'all') as B
    			,C
    			,D
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.第二模块 (接着第一模块叙述)

    from table_name
    where dt = '${dt}'
    group by
    			A
    			,B
    			,C
    			,D
    			
    --	A	B	C	D	出现在 group by 后的位置
    --	3	2	1	0	二进制排位(最先出现在group by 后的排二进制最高位)
    --	8	4	2	1	二进制转化为十进制值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.第三模块(接着第二模块叙述)

    GROUPING SETS(
    			(A)		-- GROUPING__ID 值为 7
    			,(B)	-- GROUPING__ID 值为 11
    			,(C)	-- GROUPING__ID 值为 13
    			,(D)	-- GROUPING__ID 值为 14
    			
    			,(A,B)	-- GROUPING__ID 值为 3
    			,(A,C)	-- GROUPING__ID 值为 5
    			,(A,D)	-- GROUPING__ID 值为 6
    			,(B,C)	-- GROUPING__ID 值为 9
    			,(B,D)	-- GROUPING__ID 值为 10
    			,(C,D)	-- GROUPING__ID 值为 12
    			
    			,(A,B,C)	-- GROUPING__ID 值为 1
    			,(A,B,D)	-- GROUPING__ID 值为 2
    			,(A,C,D)	-- GROUPING__ID 值为 4
    			,(B,C,D)	-- GROUPING__ID 值为 8
    			
    			,(A,B,C,D)	-- GROUPING__ID 值为 0 
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    附加测试语法

    -- 将二进制化转化为十进制
    rpad(reverse(bin(cast(GROUPING__ID AS bigint))),16,'0') 
    
    • 1
    • 2
  • 相关阅读:
    服务器常用端口号总结
    2019 java面试题基础
    计算机网络基础
    服务器开发不常见操作
    电子学会C/C++编程等级考试2021年12月(一级)真题解析
    c# 怎样能写个sql的解析器
    手把手教你搭建JAVA分布式爬虫
    动态线程池框架 DynamicTp v1.0.6版本发布。还在为Dubbo线程池耗尽烦恼吗?还在为Mq消费积压烦恼吗?
    2023-09-30 关于知识付费的思考与实践
    【附源码】计算机毕业设计JAVA计算机专业在线学习评估软件-演示录像-
  • 原文地址:https://blog.csdn.net/weixin_46609492/article/details/137128425