首页 > 解决方案 > 如何在雪花上编写 row_number() javascript UDTF?

问题描述

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

我只是尝试制作简单的 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
...

标签: sqlsnowflake-cloud-data-platform

解决方案


推荐阅读