多次元配列の集計関数
2次元配列を作成すると思います そのために。これは、ARRAY of record
よりも処理が簡単です。 。標準のarray_agg()
多次元配列を集約することはできません。ただし、そのために独自の集計関数をかなり簡単に作成できます。
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
この関連する回答の説明を読んでください:
Postgres配列へのデータの選択
クエリ
SELECT DISTINCT ON (p)
p, groundtruth, array_agg_mult(ARRAY[ARRAY[anchor_id, id]]) AS ids
FROM (
SELECT DISTINCT ON (ps.p, m.groundtruth, m.anchor_id)
ps.p, m.groundtruth, m.anchor_id, m.id
FROM (SELECT unnest(point_array) AS p) AS ps
JOIN measurement m ON ST_DWithin(ps.p, m.groundtruth, distance)
ORDER BY ps.p, m.groundtruth, m.anchor_id, random()
) x
GROUP BY p, groundtruth
ORDER BY p, random();
-
サブクエリ
x
個別のanchor_id
を取得します(p, groundtruth)
ごと 複数のピアがある場合は、ランダムな行を選択します。このようにして、接続anchor_id - id
そのまま残ります。 -
外側のクエリは、
anchor_id
の順序で、希望どおりに2次元配列を集約します。 。anchor_id
が必要な場合 ランダムに注文し、もう一度ランダムを使用します:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
そして最後に、
DISTINCT ON
1つのgroundtruth
のみを選択しますp
ごと 、再びランダムに。