雪花中的累积和

时间:2021-02-02 09:51:44

标签: javascript aggregate snowflake-cloud-data-platform

如上图所示,我想要基于以下两个约束的 VAL 的累积和(如 C_SUM)。

  1. 对于每个组,我的总和应重置为 0。
  2. 如果累计和变为负数,则应重置为 0。

1 个答案:

答案 0 :(得分:1)

  • 我们可以使用 UDTF-js 创建自定义聚合函数。

  • UDTF-js 类似于 SQL-UDTF,但在 UDTF-js 中我们可以编写 js (javascript) 代码。

  • 在讨论解决方案之前,让我们先了解一下 UDF-js 的主要 3 个组件。 所有这些组件将分别为每个组执行。

    1. 初始化:它将首先执行,每个组执行一次。
    2. processRow:执行初始化块后,processRow 将针对每一行执行。
    3. finalize:它将在组末尾的每个分区执行一次
# CREATE Aggregate Function
CREATE OR REPLACE FUNCTION "CUM_SUM"(VAL double)
    RETURNS TABLE (C_SUM double)
    LANGUAGE JAVASCRIPT
    AS '{
    processRow: function (row, rowWriter, context) {
      this.sum = this.sum + row.VAL;
      
      if (this.sum<0){
        this.sum=0;
      }
      rowWriter.writeRow({C_SUM: this.sum});
    },
    finalize: function (rowWriter, context) {
    },
    initialize: function(argumentInfo, context) {
     this.sum = 0;
    }}';
# Select Query
WITH MyTable AS (
    SELECT 'A' AS GP, 1 AS ID, 500.0 as VAL
      UNION ALL SELECT 'A', 2,-400.0
      UNION ALL SELECT 'A', 3,100.0
      UNION ALL SELECT 'A', 4,-50.0
      UNION ALL SELECT 'A', 5,-40.0
      UNION ALL SELECT 'A', 6,-100.0
      UNION ALL SELECT 'A', 7,-50.0
      UNION ALL SELECT 'A', 8,-10.0
      UNION ALL SELECT 'A', 9,30.0
      UNION ALL SELECT 'A', 10,-10.0
      UNION ALL SELECT 'B', 11,600.0
      UNION ALL SELECT 'B', 12,-1000.0
      UNION ALL SELECT 'B', 13,-1600.0
      UNION ALL SELECT 'B', 14,1000.0
      UNION ALL SELECT 'B', 15,-500.0
      UNION ALL SELECT 'B', 16,-400.0
 )
SELECT *
FROM MyTable, TABLE( CUM_SUM(TO_DOUBLE(VAL)) OVER  (PARTITION BY gp) ) as t
order by GP