GROUPING
更新时间:2025-10-16
描述
用于在包含 CUBE、ROLLUP 或 GROUPING SETS 的 SQL 语句中,判断某个在 GROUP BY 子句中的列或表达式是否为汇总结果。当结果集中的数据行是由 CUBE、ROLLUP 或 GROUPING SETS 操作产生的汇总行时,该函数返回 1;否则返回 0。GROUPING 函数可在 SELECT、HAVING 和 ORDER BY 子句中使用。
ROLLUP、CUBE 或 GROUPING SETS 操作产生的汇总结果会以 NULL 作为被分组列的值,因此 GROUPING 函数通常用于区分这些 NULL 值与表中实际存在的 NULL 值。
语法
SQL
1GROUPING( <column_expression> )
参数
参数 | 说明 |
---|---|
<column_expression> |
在 GROUP BY 子句中包含的列或表达式。 |
返回值
返回 BIGINT 值。若该列或表达式对应的数据行为汇总行,则返回 1;否则返回 0。
举例
下面的例子使用 camp
列进行分组操作,并统计 occupation
的数量,同时利用 GROUPING 函数区分汇总行与表中实际存在的 NULL 值。
SQL
1CREATE TABLE `roles` (
2 role_id INT,
3 occupation VARCHAR(32),
4 camp VARCHAR(32),
5 register_time DATE
6)
7UNIQUE KEY(role_id)
8DISTRIBUTED BY HASH(role_id) BUCKETS 1
9PROPERTIES (
10 "replication_allocation" = "tag.location.default: 1"
11);
12
13INSERT INTO `roles` VALUES
14(0, 'who am I', NULL, NULL),
15(1, 'mage', 'alliance', '2018-12-03 16:11:28'),
16(2, 'paladin', 'alliance', '2018-11-30 16:11:28'),
17(3, 'rogue', 'horde', '2018-12-01 16:11:28'),
18(4, 'priest', 'alliance', '2018-12-02 16:11:28'),
19(5, 'shaman', 'horde', NULL),
20(6, 'warrior', 'alliance', NULL),
21(7, 'warlock', 'horde', '2018-12-04 16:11:28'),
22(8, 'hunter', 'horde', NULL);
23
24SELECT
25 camp,
26 COUNT(occupation) AS occ_cnt,
27 GROUPING(camp) AS grouping
28FROM
29 `roles`
30GROUP BY
31 ROLLUP(camp);
在上述查询中,结果集中 camp
列出现了两个 NULL 值。其中,第一个 NULL(GROUPING 返回 1)表示该行为 ROLLUP 操作产生的汇总行,其 occ_cnt
为所有 camp
的 occupation
计数;第二个 NULL(GROUPING 返回 0)表示表中实际存在的 NULL 值。
Text
1+----------+---------+----------+
2| camp | occ_cnt | grouping |
3+----------+---------+----------+
4| NULL | 9 | 1 |
5| NULL | 1 | 0 |
6| alliance | 4 | 0 |
7| horde | 4 | 0 |
8+----------+---------+----------+