我正在尝试运行一个聚合数据的查询,按几个不同的字段对结果进行分组,并提取所有相关的" SubTotal"排列。 (类似于MSSQL中的CUBE())
使用Group By Rollup()
时,我只会根据Group By
函数中Rollup
字段的顺序获得排列。
例如,下面的查询(在公共数据集上运行),它按年份,年份和月份,或按年,月和奖章返回小计...但它不会按大奖章小计。
SELECT
trip_year,
trip_month,
medallion,
SUM(trip_count) AS Sum_trip_count
FROM
[nyc-tlc:yellow.Trips_ByMonth_ByMedallion]
WHERE
medallion IN ("2R76", "8J82", "3B85", "4L79", "5D59", "6H75", "7P60", "8V48", "1H12", "2C69", "2F38", "5Y86", "5j90", "8A75", "8V41", "9J24", "9J55", "1E13", "1J82")
GROUP BY
ROLLUP(trip_year,
trip_month,
medallion)
我的问题是: 我应该怎么做以获得" Sub Totals"的所有不同排列。在一个查询结果中。
已经尝试过:具有相似查询但具有不同顺序的联盟,它可以工作,但不优雅(它需要太多的工会)。 感谢
答案 0 :(得分:1)
两种情况都是正确的。在BigQuery中,ROLLUP
尊重将列出的字段视为严格排序列表的层次结构。在聚合期间,他们的订单不会被更改。
在其他SQL环境中常见的CUBE
聚合是无序的,实际上聚合了其列出的字段的每个可能的顺序/子集。目前,还没有在BigQuery中实现CUBE
。你建议的解决方法也是我建议的。 UNION
来自ROLLUP
的所有结果集使用其包含字段的每个排列。虽然不理想,但你应该得到相同的结果。
简而言之,UNION
个具有ROLLUP
字段的不同排列的几个查询是目前实现此目的的唯一方式。缺点是你指出这可能很难维护,并且在查询中可能会更昂贵。
如果您希望在BigQuery中看到CUBE
,我强烈建议您在Big Query public issue tracker上提交功能请求。请务必在此请求中包含完整的用例。
更新:要支持OP提交的feature request,请 明星 ,然后您就会收到通知更新。