GROUPING_ID
简介
GROUPING_ID
GROUPING_ID
函数用于在多维度分组查询(
GROUPING SETS
GROUPING SETS
、
ROLLUP
ROLLUP
、
CUBE
CUBE
)中,以一个整数位掩码标识当前行属于哪个聚合层级。与
GROUPING
GROUPING
函数的区别:单维度时两者结果相同;多维度时,
GROUPING_ID
GROUPING_ID
将多个维度的
GROUPING
GROUPING
值合并为一个整数,第一个维度占最高位,依此类推,无需对每个维度单独调用
GROUPING
GROUPING
。
语法
GROUPING_ID(expr1 [, expr2, ...])
参数
exprN
exprN
:GROUP BY
GROUP BY
子句中出现的列或表达式,顺序与位掩码的位权对应。第一个参数对应最高位,最后一个参数对应最低位。
返回结果
示例
单维度验证
SELECT GROUPING_ID(v)
FROM (SELECT 1 AS v) t
GROUP BY GROUPING SETS ((v), ());
+----------------+
| grouping_id(v) |
+----------------+
| 0 |
| 1 |
+----------------+
0
0
表示当前行按
v
v
分组(明细行),
1
1
表示当前行是对所有
v
v
的总计行。
多维度 GROUPING SETS 场景
以下示例统计各地区、各产品及不同汇总层级的销售额,并用
GROUPING_ID
GROUPING_ID
区分每行属于哪个层级:
-- 准备测试数据
CREATE TABLE doc_sales (
region STRING,
product STRING,
amount DECIMAL(10, 2)
);
INSERT INTO doc_sales VALUES
('North', 'A', 100),
('North', 'B', 200),
('South', 'A', 150),
('South', 'B', 300);
SELECT
region,
product,
SUM(amount) AS total_amount,
GROUPING_ID(region, product) AS gid,
GROUPING(region) AS g_region,
GROUPING(product) AS g_product
FROM doc_sales
GROUP BY GROUPING SETS (
(region, product), -- 明细:按地区+产品
(region), -- 小计:按地区
(product), -- 小计:按产品
() -- 总计
)
ORDER BY gid, region, product;
+--------+---------+--------------+-----+----------+-----------+
| region | product | total_amount | gid | g_region | g_product |
+--------+---------+--------------+-----+----------+-----------+
| North | A | 100.00 | 0 | 0 | 0 |
| North | B | 200.00 | 0 | 0 | 0 |
| South | A | 150.00 | 0 | 0 | 0 |
| South | B | 300.00 | 0 | 0 | 0 |
| North | NULL | 300.00 | 1 | 0 | 1 |
| South | NULL | 450.00 | 1 | 0 | 1 |
| NULL | A | 250.00 | 2 | 1 | 0 |
| NULL | B | 500.00 | 2 | 1 | 0 |
| NULL | NULL | 750.00 | 3 | 1 | 1 |
+--------+---------+--------------+-----+----------+-----------+
gid
gid
的含义:
gid
gid | 二进制 | 说明 |
|---|
0
0 | 00
00 | 按地区 + 产品分组(明细行) |
1
1 | 01
01 | 按地区汇总(product 被聚合) |
2
2 | 10
10 | 按产品汇总(region 被聚合) |
3
3 | 11
11 | 全局总计(两个维度均被聚合) |
用 GROUPING_ID 过滤指定层级
SELECT region, SUM(amount) AS subtotal
FROM doc_sales
GROUP BY GROUPING SETS ((region), ())
HAVING GROUPING_ID(region) = 0;
+--------+----------+
| region | subtotal |
+--------+----------+
| North | 300.00 |
| South | 450.00 |
+--------+----------+
只保留
gid = 0
gid = 0
的行,即按地区分组的小计,排除全局总计行。
注意事项
GROUPING_ID
GROUPING_ID
的参数必须是 GROUP BY
GROUP BY
子句中实际出现的列或表达式,否则报错。
- 参数顺序影响位权:第一个参数对应最高位。改变参数顺序会改变返回的整数值,但不改变语义,需在解读时保持一致。
- 结果中
NULL
NULL
有两种来源:原始数据本身为 NULL
NULL
,以及 GROUPING_ID
GROUPING_ID
对应维度被聚合时产生的占位 NULL
NULL
。可用 GROUPING(col) = 1
GROUPING(col) = 1
或 GROUPING_ID
GROUPING_ID
区分两者。
- 仅在包含
GROUPING SETS
GROUPING SETS
、ROLLUP
ROLLUP
或 CUBE
CUBE
的查询中使用;普通 GROUP BY
GROUP BY
中调用无意义(所有行的 GROUPING_ID
GROUPING_ID
均为 0
0
)。
相关文档