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
    子句中出现的列或表达式,顺序与位掩码的位权对应。第一个参数对应最高位,最后一个参数对应最低位。

返回结果

  • 返回值类型为
    BIGINT
    BIGINT
  • 返回值是各维度
    GROUPING
    GROUPING
    值按位组合后的整数。某个维度被聚合(即该维度在当前行中被汇总为小计/总计)时,对应位为
    1
    1
    ;该维度参与分组时,对应位为
    0
    0
  • 单维度时:被聚合返回
    1
    1
    ,参与分组返回
    0
    0
    ,与
    GROUPING(expr)
    GROUPING(expr)
    结果一致。
  • 多维度时:
    GROUPING_ID(a, b)
    GROUPING_ID(a, b)
    等价于
    GROUPING(a) * 2 + GROUPING(b)
    GROUPING(a) * 2 + GROUPING(b)

示例

单维度验证

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
    )。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询