多个小计 - 字段的汇总顺序

时间:2016-05-31 13:44:24

标签: google-bigquery

我正在尝试运行一个聚合数据的查询,按几个不同的字段对结果进行分组,并提取所有相关的" 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"的所有不同排列。在一个查询结果中。

已经尝试过:具有相似查询但具有不同顺序的联盟,它可以工作,但不优雅(它需要太多的工会)。 感谢

1 个答案:

答案 0 :(得分:1)

两种情况都是正确的。在BigQuery中,ROLLUP尊重将列出的字段视为严格排序列表的层次结构。在聚合期间,他们的订单不会被更改。

在其他SQL环境中常见的CUBE聚合是无序的,实际上聚合了其列出的字段的每个可能的顺序/子集。目前,还没有在BigQuery中实现CUBE。你建议的解决方法也是我建议的。 UNION来自ROLLUP的所有结果集使用其包含字段的每个排列。虽然不理想,但你应该得到相同的结果。

简而言之,UNION个具有ROLLUP字段的不同排列的几个查询是目前实现此目的的唯一方式。缺点是你指出这可能很难维护,并且在查询中可能会更昂贵。

如果您希望在BigQuery中看到CUBE,我强烈建议您在Big Query public issue tracker上提交功能请求。请务必在此请求中包含完整的用例。

更新:要支持OP提交的feature request,请 明星 ,然后您就会收到通知更新。