如何将前一行的数组累积合并为一个聚合数组?(雪花/SQL)

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。

Luk*_*zda 5

累积 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)

输出:

在此输入图像描述