Aggregeringsfunktion til flerdimensionelle arrays
Jeg formoder, at du opretter et todimensionelt array for det. Det er nemmere at håndtere end en ARRAY of record
. Standard array_agg()
kan ikke samle multidimensionelle arrays. Men du kan skrive din egen aggregerede funktion ret nemt til det:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Læs forklaringen i dette relaterede svar:
Valg af data i et Postgres-array
Forespørgsel
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();
-
Underforespørgsel
x
får distinktanchor_id
per(p, groundtruth)
og vælger en tilfældig række, hvis der er flere jævnaldrende. På denne måde forbindelsenanchor_id - id
forbliver intakt. -
Den ydre forespørgsel samler et 2-dimensionelt array, som du ønskede, sorteret efter
anchor_id
. Hvis du vil haveanchor_id
ordnet tilfældigt, brug tilfældigt igen:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
Og til sidst,
DISTINCT ON
vælger kun 1groundtruth
pr.p
, tilfældigt igen.