3

次のようなテーブルがあるとします。

  link_ids  |  length
------------+-----------
 {1,4}      | {1,2}
 {2,5}      | {0,1}

それぞれの最小の長さを見つけるにはどうすればよいlink_idsですか?

したがって、最終的な出力は次のようになります。

  link_ids  |  length
------------+-----------
 {1,4}      | 1
 {2,5}      | 0
4

5 に答える 5

8

次のようなテーブルを想定します。

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

Postgres 9.3 以降のクエリ:

SELECT link_ids, min(len) AS min_length
FROM   tbl t, unnest(t.length) len  -- implicit LATERAL join
GROUP  BY 1;

または、小さな関数を作成します (Postgres 8.4+):

CREATE OR REPLACE FUNCTION arr_min(anyarray)
  RETURNS anyelement LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
'SELECT min(i) FROM unnest($1) i';

PARALLEL SAFEPostgres 9.6 以降でのみ追加してください。それで:

SELECT link_ids, arr_min(length) AS min_length FROM t;

関数はインライン化でき、高速です。

または、単純な長さの配列integerの場合は、追加のモジュールとその組み込み関数(Postgres 8.3+) を使用します。intarraysort()

SELECT link_ids, (sort(length))[1] AS min_length FROM t;
于 2015-02-10T00:46:20.417 に答える
3

tテーブル名がであり、の各値link_idsが一意であると仮定します。

select link_ids, min(len)
from (select link_ids, unnest(length) as len from t) as t
group by link_ids;

 link_ids | min
----------+-----
 {2,5}    |   0
 {1,4}    |   1
于 2015-02-10T00:23:41.530 に答える