我正在尝试运行一个聚合数据的查询,按几个不同的字段对结果进行分组,并提取 all 相关的"SubTotal"排列 . (类似于MSSQL中的CUBE())
使用 Group By Rollup()
时,我只根据 Rollup
函数中 Group By
字段的顺序获取排列 . 例如,下面的查询(在公共数据集上运行),它按年份,年份和月份,或年,月和奖章返回小计...但它不按小奖章小计 .
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”的所有不同排列 .
已经尝试过:具有类似查询但具有不同顺序的联盟,它可以工作,但不优雅(它需要太多的工会) . 谢谢
1 回答
你是两个都是正确的 . 在BigQuery中,ROLLUP尊重将列出的字段视为严格排序列表的层次结构 . 在聚合期间,他们的订单不会更改 .
在其他SQL环境中常见的CUBE聚合是无序的,实际上聚合了其列出的字段的每个可能的顺序/子集 . 目前,还没有在BigQuery中实现
CUBE
. 你建议的解决方法也是我建议的 .UNION
来自ROLLUP
的所有结果集使用其包含的字段的每个排列 . 虽然不理想,但你应该得到相同的结果 .简而言之,具有
ROLLUP
字段的不同排列的几个查询的UNION
是目前实现此目的的 only 方式 . 缺点是你声明这可能很难维护,并且在查询中可能更昂贵 .如果您希望在BigQuery中看到
CUBE
,我强烈建议您在Big Query public issue tracker上提交功能请求 . 请务必在此请求中包含完整的用例 .UPDATE :为了支持OP提交的feature request,请 star 它,您将收到有关更新的通知 .