我试图让这个用户定义的表函数工作,但我被卡住了。
我只是尝试制作简单的 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;
列rn
和rn_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
...