如何在雪花上写一个row_number()javascript UDTF?

时间:2018-06-08 20:32:59

标签: sql snowflake-datawarehouse

我试图让这个用户定义的表函数工作,但我被卡住了。

我只是试图将简单的UDTF作为尝试测试UDTF注意到的一些奇怪行为的一部分,我认为row_number()将是一个不错的选择。但它不起作用,而且我被困住了。

这是UDTF:

CREATE OR REPLACE FUNCTION udtf_row_num()
    RETURNS TABLE(rn DOUBLE)
LANGUAGE JAVASCRIPT
CALLED ON NULL INPUT
VOLATILE
AS '
{
    initialize: function() {
        this.rownum = 0;
        this.inc = 1;
    },

    processRow: function (row, rowWriter, context) {
        this.rownum += this.inc;
        rowWriter.writeRow({RN:  this.rownum});
    },

    finalize: function (rowWriter, context) {/*...*/},
}
';

问题在于它永远不会增加!输出始终为1.

以下是您可以测试的查询:

SELECT
    a.id,
    a.customer_id,
    rn,
    row_number() OVER (PARTITION BY a.customer_id ORDER BY a.id) AS rn_correct
FROM (
         SELECT
             seq4() AS id,
             seq4() % 3 AS customer_id
         FROM table(generator(rowcount => 20)) v
     ) a
JOIN table(udtf_row_num() OVER ( PARTITION BY a.customer_id
    ORDER BY a.id )) l
ORDER BY a.customer_id, a.id;

rnrn_correct应具有相同的值。

相反,这是我得到的:

ID  CUSTOMER_ID RN  RN_CORRECT
0   0   1   1
3   0   1   2
6   0   1   3
9   0   1   4
12  0   1   5
15  0   1   6
18  0   1   7
1   1   1   1
4   1   1   2
7   1   1   3
10  1   1   4
13  1   1   5
16  1   1   6
...

0 个答案:

没有答案