Postgres - 找到数组的最小值

jay*_*ynp 2 sql arrays postgresql min unnest

假设我有一个这样的表:

  link_ids  |  length
------------+-----------
 {1,4}      | {1,2}
 {2,5}      | {0,1}
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到每个的最小长度link_ids

所以最终输出看起来像:

  link_ids  |  length
------------+-----------
 {1,4}      | 1
 {2,5}      | 0
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

假设一个这样的表:

CREATE TABLE t (
  link_ids int[] PRIMARY KEY     -- which is odd for a PK
, length int[]
, CHECK (length <> '{}'::int[])  -- rules out null and empty in length
);
Run Code Online (Sandbox Code Playgroud)

此查询适用于Postgres 9.3+

SELECT link_ids, min(len) As min_length
FROM   t, unnest(t.length) len  -- implicit LATERAL join
GROUP  BY 1;
Run Code Online (Sandbox Code Playgroud)

或者你创建一个小功能(Postgres 8.4+):

CREATE OR REPLACE FUNCTION arr_min(anyarray) RETURNS anyelement AS
'SELECT min(i) FROM unnest($1) i' LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

然后:

SELECT link_ids, arr_min(length) AS min_length FROM t;
Run Code Online (Sandbox Code Playgroud)

或者,为了快速实现这一点,只要我们处理普通长度的integer数组,您就可以使用附加模块intarray并使用内置函数(Postgres 8.3+):sort()

SELECT link_ids, (sort(length))[1] AS min_length FROM t;
Run Code Online (Sandbox Code Playgroud)