Arrays Postgres,找到数组列的最小值并获取其位置
让我们假设下表:testArrays 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 |
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。但是,每个副本都有相同的最小距离,这对我的进一步工作并不重要。再次感谢您的帮助,距离数组中似乎有重复项,这会导致结果中出现更多行。如果这对你有帮助,我很高兴。+为了简洁。+为了简洁。