GROUP BY 修饰符是什么
ClickHouse 的 GROUP BY 支持 WITH ROLLUP、WITH CUBE 与 WITH TOTALS:ROLLUP 按分组列从右向左逐级做小计,CUBE 输出所有列组合的小计,WITH TOTALS 额外返回一行不分组的总计。它们让报表类查询一次取到各级口径,省掉多次查询与应用层拼接。汇总行的键列会用默认值填充(空字符串或 0),展示时需要与真实分组值区分开。
基本信息
| WITH ROLLUP | 按分组列从右向左逐级小计 |
|---|---|
| WITH CUBE | 输出所有列组合的小计 |
| WITH TOTALS | 额外输出一行不分组的总计 |
| 汇总行键值 | 用默认值填充(空串或 0) |
| 所属系统 | ClickHouse |
典型使用场景
- 多维报表:地区与产品两个维度一次取出小计与明细
- 交叉汇总:用 CUBE 得到所有维度组合的统计
- 总量核对:WITH TOTALS 取总计并与明细行相加比对
- 减少查询次数:一次拿到各级粒度,避免多次往返
- 前端展开树:按层级展示可折叠的汇总结构
写法示例
写法示例
SELECT
region,
product,
sum(amount) AS total
FROM sales
GROUP BY region, product
WITH ROLLUP -- 依次产出 (region,product)、(region)、总计
ORDER BY region, product;修饰符读法
| 修饰符 | 输出 | 注意 |
|---|---|---|
| WITH ROLLUP | 逐级小计 | 层级顺序按分组列从右向左 |
| WITH CUBE | 所有组合小计 | 维度多时结果行数增长快 |
| WITH TOTALS | 一行不分组总计 | 键列为默认值 |
| 汇总行 | 键值为默认值 | 展示时要与真实值区分 |
| 结果规模 | 与维度基数相关 | 组合维度过高要预估行数 |
汇总行的键列是默认值填充(空字符串、0 等),前端展示时务必与真实取值区分,否则会出现「空地区」这种误导性分组。
WITH TOTALS 的总计行在分布式表上的行为需要按版本验证,跨节点报表上线前先在小范围核对结果是否符合预期。
组合维度过高时 CUBE 的输出行数会快速增长,先按各维度的基数估算结果规模,再决定是否使用这个修饰符。
ROLLUP 与 TOTALS 可以同时使用,输出里既有逐级小计也有一行总计;解析结果时按键列是否为空区分汇总行与明细行。