我这里有一个令人困惑的问题。我正在使用一些数组并尝试将所有数组中的10个未成像值合并,以及它们所在的数组以及它们在这样的数组中的位置。
我的关系是数组(id int,array float []);
所以,在它上面我有几个存储的数组: 1,'{v1,v2,v3,v4,v5 ...}' 2,'{v1,v2,v3,v4,v5 ...}'......等等
我的第一个查询是下一个:
WITH T1 AS(SELECT id, unnest(array) value from arrays order by value LIMIT 10)
SELECT T1.id as id, cell(array,value) as offset, value from T1;
在这种情况下,cell()是我开发的UDF,用于返回给定数组和任意值的位置。
第二个查询(使用w函数)是下一个:
WITH T1 AS(SELECT id, unnest(array) value from arrays)
SELECT id, row_number() over (partition by sid) as offset, value from T1 order by value LIMIT 10;
尽管它们都返回相同的值(这是正确的),但偏移量并不相同,看起来它们在某种程度上是颠倒的。
这些是一些示例输出,我正在使用更大的数组,你可以看到problemim有。
查询1输出:
id | offset | value
-----+--------+-----------
1 | 17569 | 0.0156216
1 | 20801 | 0.0164499
1 | 20802 | 0.0171007
1 | 17570 | 0.0171008
1 | 17568 | 0.0180476
1 | 20800 | 0.0182249
1 | 20803 | 0.0194675
1 | 1411 | 0.02142
1 | 1412 | 0.02142
1 | 1413 | 0.0215976
查询2输出:
id | offset | value
-----+--------+-----------
1 | 6591 | 0.0156216
1 | 9823 | 0.0164499
1 | 9824 | 0.0171007
1 | 6592 | 0.0171008
1 | 6590 | 0.0180476
1 | 9822 | 0.0182249
1 | 9825 | 0.0194675
1 | 26144 | 0.02142
1 | 26140 | 0.02142
1 | 26149 | 0.0215976
我很感激任何帮助。谢谢!
答案 0 :(得分:0)
您还没有在查询2中的窗口函数中指定一个订单,这意味着在您应用外部sid
之前,Postgres可能会按ORDER BY value
进行内部排序。
WITH t1 AS (
SELECT id, UNNEST( array ) AS value
FROM arrays
)
SELECT id, row_number() OVER ( PARTITION BY sid ORDER BY value ) as offset, value
FROM t1
ORDER BY value
LIMIT 10;