Funzione di aggregazione per array multidimensionali
Suppongo che crei un array bidimensionale per quello. È più facile da gestire di un ARRAY of record
. Standard array_agg()
non può aggregare array multidimensionali. Ma puoi scrivere la tua funzione di aggregazione piuttosto facilmente per questo:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Leggi la spiegazione in questa risposta correlata:
Selezione dei dati in un array Postgres
Interrogazione
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();
-
Sottoquery
x
ottieneanchor_id
distinto per(p, groundtruth)
e seleziona una riga casuale se sono presenti più peer. In questo modo la connessioneanchor_id - id
rimane intatto. -
La query esterna aggrega un array bidimensionale come desideri, ordinato per
anchor_id
. Se vuoi avereanchor_id
ordinato a caso, usa ancora una volta casuale:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
E infine, il
DISTINCT ON
sceglie solo 1groundtruth
perp
, di nuovo in modo casuale.