Bigquery中的部分累积聚合

时间:2016-01-07 18:53:51

标签: google-bigquery

是否有办法仅对某些GROUP BY列而不是所有GROUP BY列进行汇总汇总?我试图实现SELECT a,b,SUM(c) FROM sample.data GROUP BY a,b,而不是SELECT a,b,SUM(c) FROM sample.data GROUP BY ROLLUP(a,b)SELECT a,b,SUM(c) FROM sample.data GROUP BY a, ROLLUP(b)。这在BigQuery中可行吗?

我现在想象的唯一方法就是为每个我不想汇总的列创建GROUPING列,并将这些列过滤为0。但是,在尝试此操作时,我会收到错误Errors encountered during job execution. Resources exceeded during query execution.,而不包括ROLLUP()时我得到的错误。 (即使GROUP EACH BY也出现相同的错误。)

思想?

3 个答案:

答案 0 :(得分:2)

我不认为GROUP BY a, ROLLUP(b)之类的sysntax可用!不是!
就像你的案例的解决方法一样,我建议在下面模仿这样的语法

所以,假设你有sample.dataa, b, c, d,你需要模仿

SELECT a, b, c, SUM(d) as s 
FROM table 
GROUP BY a, b, ROLLUP(c)  

下面是ROLLUP-less “version”

SELECT a, b, c, s 
FROM (
  SELECT a, b, c, SUM(d) AS s 
  FROM sample.data
  GROUP BY a, b, c
  ), (
  SELECT a, b, NULL AS c, SUM(s) AS s
  FROM (
    SELECT a, b, c, SUM(d) AS s 
    FROM sample.data
    GROUP BY a, b, c
  ) 
  GROUP BY 1, 2, 3
)
ORDER BY a, b, c

答案 1 :(得分:1)

MS SQL支持组如下:

GROUP BY a, ROLLUP(b, c)
GROUP BY ROLLUP(a, b), ROLLUP(c, d)

参见文章https://technet.microsoft.com/en-us/library/bb522495(v=sql.105).aspx

谷歌BQ仍然不支持。

您可以使用 HAVING 子句,如下所示:

SELECT a,b,SUM(c) FROM sample.data GROUP BY ROLLUP(a,b) 
HAVING a is not null

OR

SELECT a,b,SUM(c) FROM sample.data GROUP BY ROLLUP(a,b) 
HAVING GROUPING(a)=0

此解决方案无法解决错误:查询执行期间超出资源的问题。

我想,对汇总,多维数据集和分组集的完全支持是未来BQ版本的一个很好的功能。

答案 2 :(得分:1)

RollUp在Legacy SQL(https://cloud.google.com/bigquery/docs/reference/legacy-sql#groupby)中提供Bigquery,如果您还需要使用标准SQL中的某些功能,那就不是很好。