雪花中GROUP BY CUBE的替代

时间:2020-11-05 14:39:48

标签: sql snowflake-cloud-data-platform

我正在尝试对Snowflake中的8个不同元素进行GROUP BY CUBE(),但根据文档,“ Snowflake在每个多维数据集中最多允许7个元素(相当于128个分组集)”。

这是我需要运行的查询之一的限制。查询的基本形式如下

SELECT A, B, C, D, E, F, G, H
FROM (
    SELECT '1' AS A, '2' AS B, '3' AS C, '4' AS D, '5' AS E, '6' AS F, '7' AS G, 8 AS H
  ) SUB
GROUP BY CUBE(A,B,C,D,E,F,G,H);

如果删除了H列,则可以正常工作。但是当我在查询中添加H时,我得到了

SQL编译错误:分组集(256)超过了允许的最大分组集(128)

如何获得具有8个元素的GROUP BY CUBE的相同结果?我做了一些研究,看来GROUP BY GROUPING SETS可以工作,但在同一查询块中仍然有128个分组集限制。

2 个答案:

答案 0 :(得分:1)

您可以通过两个操作的并集来生成2 ^ 8组合:一个带有GROUP BY CUBE(A,B,C,D,E,F,G), H的多维数据集-一个没有H的多维数据集,并将其设置为空。


with data as (
  SELECT '1' AS A, '2' AS B, '3' AS C, '4' AS D, '5' AS E, '6' AS F, '7' AS G, 8 AS H
)

SELECT A, B, C, D, E, F, G, H
FROM data
GROUP BY CUBE(A, B, C, D, E, F, G), H
union all
SELECT A, B, C, D, E, F, G, null
FROM data
GROUP BY CUBE(A, B, C, D, E, F, G)

您可以通过更少的组合来证明这一点:

SELECT A, B, C
FROM data
GROUP BY CUBE(A, B), C
union all
SELECT A, B, null
FROM data
GROUP BY CUBE(A, B)

您会看到它给出的结果与GROUP BY CUBE(A,B,C)相同。

答案 1 :(得分:0)

蛮力方法是union all

select null as a, b, c, d, e, f, g, h
from t
group by cube (b, c, d, e, f, g, h)
union all
select a, null as b, c, d, e, f, g, h
from t
group by cube (a, c, d, e, f, g, h)
union all
. . .

这对于8列是可行的。如果您还有其他内容,将会变得很麻烦。

如果仅使用cube来生成行,则可能有更简单的方法来完成相同的事情。