Postgres:窗口函数row_number()输出错误?

时间:2015-03-05 18:23:29

标签: row psql

我这里有一个令人困惑的问题。我正在使用一些数组并尝试将所有数组中的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  

我很感激任何帮助。谢谢!

1 个答案:

答案 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;