• 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
  • 相关阅读:
    IDEA好用插件推荐
    iOS源码-工程目录讲解
    2022年SQL经典面试题总结(带解析)
    Python VScode 配置
    bash和sh和./的区别
    配置测试ip、正式ip、本地ip
    灰度、rgb之间的概念
    网络运维与网络安全 学习笔记2023.11.17
    面试突击87:说一下 Spring 事务传播机制?
    为啥$p(w|D)=p(y|X,w)$?
  • 原文地址:https://blog.csdn.net/weixin_46609492/article/details/137128425