Fungsi agregat untuk array multidimensi
Saya kira Anda membuat array dua dimensi untuk itu. Itu lebih mudah ditangani daripada ARRAY of record
. array_agg()
standar tidak dapat menggabungkan array multidimensi. Tetapi Anda dapat menulis fungsi agregat Anda sendiri dengan lebih mudah untuk itu:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Baca penjelasannya di jawaban terkait ini:
Memilih data ke dalam larik Postgres
Kueri
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();
-
Subkueri
x
mendapatanchor_id
yang berbeda per(p, groundtruth)
dan mengambil baris acak jika ada beberapa rekan. Dengan cara ini koneksianchor_id - id
tetap utuh. -
Kueri luar menggabungkan larik 2 dimensi seperti yang Anda inginkan, diurutkan berdasarkan
anchor_id
. Jika Anda ingin memilikianchor_id
dipesan secara acak, gunakan acak sekali lagi:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
Dan akhirnya,
DISTINCT ON
hanya memilih 1groundtruth
perp
, secara acak lagi.