当结构数据表中,多列维度字段场景,
需要看不同维度聚合后的数据集时。
整体 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)
下面进行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
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 二进制转化为十进制值
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
)
附加测试语法
-- 将二进制化转化为十进制
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),16,'0')