sql - 无法理解 GROUPING_ID() 函数在我的情况下是如何工作的
问题描述
我有以下查询:
SELECT GROUPING_ID( shipcountry, shipregion, shipcity ) AS grp_id,
shipcountry, shipregion, shipcity,
COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY ROLLUP( shipcountry, shipregion, shipcity );
此查询生成以下输出(此处以缩写形式显示): grp_id shipcountry shipregion shipcity numorders
0 Argentina NULL Buenos Aires 16
1 Argentina NULL NULL 16
3 Argentina NULL NULL 16
...
0 USA AK Anchorage 10
1 USA AK NULL 10
0 USA CA San Francisco 4
1 USA CA NULL 4
0 USA ID Boise 31
1 USA ID NULL 31
...
3 USA NULL NULL 122
...
7 NULL NULL NULL 830
我想了解 grp_id 列背后的逻辑以及 0,1,3,7 是如何生成的?
解决方案
GROUPING_ID
返回一个设置了位的 int,指定相应的列是否被聚合(“1”表示聚合)。所以:
0 --> 000 --> no rollup
1 --> 001 --> rollup on shipcountry
7 --> 111 --> rollup on all three columns
等等。GROUPING()
当键值可以取值时,此功能特别有用NULL
。通常,NULL
用于确定正在汇总哪些列。但是,如果密钥本身可以,那是不安全的NULL
。
推荐阅读
- reactjs - socket.io 中的一个客户端的连接事件被无限次触发
- shell - 无法使用 Shell 和 python 解析日志文件
- java - 大的负模给出错误的结果
- python - Pandas 获得虚拟反转以进行预测
- java - Spring data JPA - 不要在 XML 文件中硬编码密码
- oracle - 无法在 oracle 中创建表函数,在 FETCH 游标和 INTO 变量之间发现类型不匹配
- python - 在大熊猫中获取假人中的分类值的频率
- java - 通过将二维数组复制到一维数组来对其进行排序,输出是正确的,但迭代正在重复
- google-bigquery - BigQuery 表创建选项
- java - 如果出现 SQLException,insert 语句会发生什么?