Rfu*_*ful 5 sql snowflake-cloud-data-platform
想象一下,我有一个包含两列的表,一个日期 DATE 和一个字符串数组 ITEMS。
我想创建一个列 ITEMS_AGG ,其中包含前一行中所有数组的聚合,即类似:
DATE ITEMS ITEMS_AGG
1 a, b a, b
2 a, c a, b, c
3 b, c a, b, c
4. a, d a, b, c, d
5. a, b, e a, b, c, d, e
Run Code Online (Sandbox Code Playgroud)
ETC。
累积 array_agg 与定义为JavaScript UDTF的不同。
样本数据:
CREATE OR REPLACE TABLE test(grp TEXT, date INT, ITEMS ARRAY)
AS
SELECT 'X',1, ARRAY_CONSTRUCT('a', 'b')
UNION SELECT 'X',2, ARRAY_CONSTRUCT('a', 'c')
UNION SELECT 'X',3, ARRAY_CONSTRUCT('b', 'c')
UNION SELECT 'X',4, ARRAY_CONSTRUCT('a', 'd')
UNION SELECT 'X',5, ARRAY_CONSTRUCT('a', 'b', 'e')
UNION SELECT 'Y',1, ARRAY_CONSTRUCT('z')
UNION SELECT 'Y',2, ARRAY_CONSTRUCT('y','x')
UNION SELECT 'Y',3, ARRAY_CONSTRUCT('y');
Run Code Online (Sandbox Code Playgroud)
功能:
CREATE OR REPLACE FUNCTION aggregate (TS ARRAY)
RETURNS table (output variant)
LANGUAGE JAVASCRIPT
STRICT
IMMUTABLE
AS '
{
initialize: function(argumentInfo, context) {
this.result = [];
},
processRow: function (row, rowWriter, context) {
this.result = [...new Set(this.result.concat(row.TS))];
rowWriter.writeRow({OUTPUT: this.result.sort()});
}
}
';
Run Code Online (Sandbox Code Playgroud)
询问:
SELECT *
FROM test, TABLE(aggregate(ITEMS) OVER(PARTITION BY grp ORDER BY date))
ORDER BY grp, date;
Run Code Online (Sandbox Code Playgroud)
输出: