Aggreagate-functie voor multidimensionale arrays
Ik veronderstel dat je een tweedimensionale array maakt daarom. Dat is gemakkelijker te hanteren dan een ARRAY of record
. Standaard array_agg()
kan geen multidimensionale arrays samenvoegen. Maar daarvoor kun je vrij gemakkelijk je eigen aggregatiefunctie schrijven:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Lees de uitleg in dit gerelateerde antwoord:
Gegevens selecteren in een Postgres-array
Zoekopdracht
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();
-
Subquery
x
krijgt een duidelijkeanchor_id
per(p, groundtruth)
en kiest een willekeurige rij als er meerdere peers zijn. Op deze manier wordt de verbindinganchor_id - id
blijft intact. -
De buitenste query aggregeert een 2-dimensionale array zoals u wenste, geordend op
anchor_id
. Als uanchor_id
. wilt hebben willekeurig besteld, gebruik nogmaals willekeurig:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
En tot slot, de
DISTINCT ON
kiest slechts 1groundtruth
perp
, weer willekeurig.