Arrays Postgres,找到数组列的最小值并获取其位置

Arrays Postgres,找到数组列的最小值并获取其位置,arrays,postgresql,greatest-n-per-group,Arrays,Postgresql,Greatest N Per Group,让我们假设下表:test ids | l_ids | distance -----------------+----------- 53 | {150,40} | {1.235, 2.265} 22 | {20,520} | {0.158, 0.568} 两个阵列的位置(l_ID,距离)是相互依赖的,这意味着 150对应于1.235, 40对应于2.265,依此类推 我想得到最小距离和相应的l_id。因此结果应该是这样的: ids | l_ids |

让我们假设下表:test

ids | l_ids      |  distance
-----------------+-----------
 53 | {150,40}   | {1.235, 2.265}
 22 | {20,520}   | {0.158, 0.568}
两个阵列的位置(l_ID,距离)是相互依赖的,这意味着 150对应于1.235, 40对应于2.265,依此类推

我想得到最小距离和相应的l_id。因此结果应该是这样的:

   ids | l_ids      |  distance
   ----------------+-----------
    53 |  150       |  1.235
    22 |   20       |  0.158
通过运行以下命令:

select l_ids, min(dist) as min_distance 
from test, unnest(test.distance) dist
group by 1; 
结果是:

     l_ids      |  dist
    ------------+-----------
     {150,40}   |  1.235
     {20,520}   |  0.158
我想得到最小值在距离数组中的位置,以便从l_id数组中得到相应的id


有什么指导方针吗?提前谢谢

如果ID是唯一标识符,并且在
距离
数组中没有重复的值,那么这应该可以工作:

SELECT DISTINCT ON (ctid) l_ids, distance
FROM (SELECT ctid,
             unnest(l_ids) AS l_ids,
             unnest(distance) AS distance
      FROM test
     ) q
ORDER BY ctid, distance;

 l_ids | distance
-------+----------
   150 |    1.235
    20 |    0.158
(2 rows)
SELECT a.* from  
(SELECT ids, UNNEST(l_ids) AS l_ids, UNNEST (distance) AS distance  FROM test) a
INNER JOIN (SELECT ids, MIN(distance) as mind FROM (
        SELECT ids,  UNNEST (distance) AS distance  FROM test 
    ) t
GROUP BY ids ) t
ON
a.ids = t.ids and a.distance = t.mind

如果ID是唯一标识符,并且在
distance
数组中没有重复的值,那么这应该可以工作:

SELECT a.* from  
(SELECT ids, UNNEST(l_ids) AS l_ids, UNNEST (distance) AS distance  FROM test) a
INNER JOIN (SELECT ids, MIN(distance) as mind FROM (
        SELECT ids,  UNNEST (distance) AS distance  FROM test 
    ) t
GROUP BY ids ) t
ON
a.ids = t.ids and a.distance = t.mind
从9.4开始,您可以使用:

否则,这是典型的查询。

从9.4开始,您可以使用:



否则,这是典型的查询。

距离
数组中,值是否唯一?或者可能是
{1.235,1.235,2.265}
也会发生?数组的长度可能大于2,但总是彼此相等。您是否可以在
l_id
中使用,例如:
{150,70,40}
和在
距离中使用这些值:
{1.235,1.235,2.265}
1.235
重复)您使用哪个PostgreSQL版本?psql(9.5.4)版本在
distance
array中,值是唯一的?或者可能是
{1.235,1.235,2.265}
也会发生?数组的长度可能大于2,但总是彼此相等。您是否可以在
l_id
中使用,例如:
{150,70,40}
和在
距离中使用这些值:
{1.235,1.235,2.265}
1.235
重复)您使用哪个PostgreSQL版本?psql(9.5.4)版本用于回复。它起作用了。请检查我在问题中的编辑。使用
ids
而不是
ctid
。感谢您的回复。它起作用了。请检查我在问题中的编辑。使用
ids
而不是
ctid
。谢谢,它真的很接近解决方案。但是,它会返回12行以上。我查了一下有没有重复的。ID是唯一的,在距离上没有重复值。正如我说的,它真的是闭合的。该查询返回10个重复的ID。但是,每个副本都有相同的最小距离,这对我的进一步工作并不重要。再次感谢您的帮助,距离数组中似乎有重复项,这会导致结果中出现更多行。如果这对你有帮助,我很高兴。谢谢,它真的接近解决方案了。但是,它会返回12行以上。我查了一下有没有重复的。ID是唯一的,在距离上没有重复值。正如我说的,它真的是闭合的。该查询返回10个重复的ID。但是,每个副本都有相同的最小距离,这对我的进一步工作并不重要。再次感谢您的帮助,距离数组中似乎有重复项,这会导致结果中出现更多行。如果这对你有帮助,我很高兴。+为了简洁。+为了简洁。