Apache Doris GROUPING_ID函数详解:分组级别计算利器
概述
在数据分析领域,GROUP BY查询是我们最常用的操作之一。Apache Doris提供的GROUPING_ID函数是一个强大的聚合函数,它能够帮助我们识别GROUP BY查询结果中每一行的分组级别。本文将深入解析GROUPING_ID函数的工作原理、使用场景和实际应用。
GROUPING_ID函数原理
GROUPING_ID函数返回一个整数位图,表示在GROUP BY列表中哪些列没有被聚合到给定的输出行中。这个函数特别适用于配合ROLLUP、CUBE或GROUPING SETS等高级分组操作使用。
核心特性
- 位图表示:返回值为BIGINT类型,每一位代表一个分组列的状态
- 灵活应用:可在SELECT列表、HAVING或ORDER BY子句中使用
- 分组识别:精确识别当前行属于哪个分组级别
语法结构
GROUPING_ID(<column_expression> [, ...])
参数说明
参数名 | 描述 |
---|---|
column_expression | GROUP BY子句中的列表达式,可指定多个 |
实际应用案例
案例一:识别分组级别
SELECT
department,
CASE
WHEN GROUPING_ID(department, level) = 0 THEN level
WHEN GROUPING_ID(department, level) = 1 THEN CONCAT('Total: ', department)
WHEN GROUPING_ID(department, level) = 3 THEN 'Total: Company'
ELSE 'Unknown'
END AS `Job Title`,
COUNT(uid) AS `Employee Count`
FROM employee
GROUP BY ROLLUP(department, level)
ORDER BY GROUPING_ID(department, level) ASC;
执行结果分析:
- 当GROUPING_ID返回0时,表示department和level都参与了分组
- 返回1时,表示只有department参与了分组(level被聚合)
- 返回3时,表示两个列都被聚合(公司总计)
这种模式非常适合制作带有小计和总计的报表。
案例二:结果集过滤
SELECT
department,
CASE
WHEN GROUPING_ID(department, level) = 0 THEN level
WHEN GROUPING_ID(department, level) = 1 THEN CONCAT('Total: ', department)
WHEN GROUPING_ID(department, level) = 3 THEN 'Total: Company'
ELSE 'Unknown'
END AS `Job Title`,
COUNT(uid) AS `Count`
FROM employee
GROUP BY ROLLUP(department, level)
HAVING `Job Title` = 'Senior';
执行效果: 这个查询只返回那些具体到员工级别的记录(即GROUPING_ID=0且职位为"Senior"的记录),过滤掉了所有汇总行。
高级应用技巧
-
多级报表生成:结合ROLLUP和GROUPING_ID可以轻松生成包含部门小计和公司总计的多级报表
-
动态标签:通过CASE语句基于GROUPING_ID值动态生成行标签,使报表更易读
-
结果筛选:在HAVING子句中使用GROUPING_ID可以精确控制返回哪些级别的汇总数据
-
排序控制:在ORDER BY中使用GROUPING_ID可以确保汇总行出现在合适的位置
注意事项
-
GROUPING_ID的参数顺序会影响返回的位图值,必须与GROUP BY子句中的列顺序一致
-
对于包含多个分组列的复杂查询,建议先测试GROUPING_ID的返回值以确认分组级别
-
在大型数据集上使用ROLLUP等操作时要注意性能影响
总结
Apache Doris的GROUPING_ID函数为复杂的分组分析提供了强大的支持。通过理解其位图表示原理和掌握实际应用技巧,数据分析师可以更高效地制作各种汇总报表,实现数据的多维度分析。无论是简单的部门统计还是复杂的多级报表,GROUPING_ID都能提供清晰的分组级别标识,使数据分析工作更加得心应手。
PaddleOCR-VL
PaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00- DDeepSeek-V3.2-ExpDeepSeek-V3.2-Exp是DeepSeek推出的实验性模型,基于V3.1-Terminus架构,创新引入DeepSeek Sparse Attention稀疏注意力机制,在保持模型输出质量的同时,大幅提升长文本场景下的训练与推理效率。该模型在MMLU-Pro、GPQA-Diamond等多领域公开基准测试中表现与V3.1-Terminus相当,支持HuggingFace、SGLang、vLLM等多种本地运行方式,开源内核设计便于研究,采用MIT许可证。【此简介由AI生成】Python00
openPangu-Ultra-MoE-718B-V1.1
昇腾原生的开源盘古 Ultra-MoE-718B-V1.1 语言模型Python00ops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。C++0135AI内容魔方
AI内容专区,汇集全球AI开源项目,集结模块、可组合的内容,致力于分享、交流。03Spark-Chemistry-X1-13B
科大讯飞星火化学-X1-13B (iFLYTEK Spark Chemistry-X1-13B) 是一款专为化学领域优化的大语言模型。它由星火-X1 (Spark-X1) 基础模型微调而来,在化学知识问答、分子性质预测、化学名称转换和科学推理方面展现出强大的能力,同时保持了强大的通用语言理解与生成能力。Python00Spark-Scilit-X1-13B
FLYTEK Spark Scilit-X1-13B is based on the latest generation of iFLYTEK Foundation Model, and has been trained on multiple core tasks derived from scientific literature. As a large language model tailored for academic research scenarios, it has shown excellent performance in Paper Assisted Reading, Academic Translation, English Polishing, and Review Generation, aiming to provide efficient and accurate intelligent assistance for researchers, faculty members, and students.Python00GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00- HHowToCook程序员在家做饭方法指南。Programmer's guide about how to cook at home (Chinese only).Dockerfile011
- PpathwayPathway is an open framework for high-throughput and low-latency real-time data processing.Python00
最新内容推荐
项目优选









