在处理字段分组聚合时,如果需要多层次的聚合,有时还需要在新的层次进行该字段的合并,但SQL语言并没有提供直接的语法和简单的函数进行支持,经过MAP_UNION
的去重操作,结合其他的一些数组转字典的操作,可以实现该功能。具体来说,已知表1中有两行数据
c1 | c2 | c3 |
s1 | d1 | r1,r2 |
s1 | d2 | r1,r3 |
怎么得到表2
c1 | c2 | c3 |
s1 | d1,d2 | r1,r2,r3 |
得到表2的数据,最直接的思路是通过GROUP BY
进行分组聚合,c2列可以用过COLLECT_SET
函数外加ARRAY_JOIN
实现。对于c3列,需要先SPLIT
成数组,然后再分组合并。查询MaxCompute SQL的函数手册,在数组方面并没有这样的功能。随后看到MAP_UNION
的键可以去重,转而想到把数组转换成字典,合并字典的键后,再提取键转为数组,具体的代码可以参考:
WITH test_table AS (
SELECT 's1' AS c1
,'d1' AS c2
,'r1,r2' AS c3
UNION
SELECT 's1' AS c1
,'d2' AS c2
,'r1,r3' AS c3
)
SELECT c1
,ARRAY_JOIN(COLLECT_SET(c2), ',')
,ARRAY_JOIN(MAP_KEYS(MAP_UNION(MAP_FROM_ARRAYS(SPLIT(c3, ','), ARRAY_REPEAT(1, SIZE(SPLIT(c3, ',')))))), ',')
FROM test_table
GROUP BY c1
;
另外一种思路是设法让表1回到表3的状态,然后再对c3通过COLLECT_SET
函数外加ARRAY_JOIN
来实现。
c1 | c2 | c3 |
s1 | d1 | r1 |
s1 | d1 | r2 |
s1 | d2 | r1 |
s1 | d2 | r3 |