Aggregeringsfunktion för flerdimensionella arrayer
Jag antar att du skapar en tvådimensionell array för det. Det är lättare att hantera än en ARRAY of record
. Standard array_agg()
kan inte aggregera flerdimensionella arrayer. Men du kan skriva din egen aggregatfunktion ganska enkelt för det:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Läs förklaringen i detta relaterade svar:
Välja data i en Postgres-matris
Fråga
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();
-
Underfråga
x
får distinktanchor_id
per(p, groundtruth)
och väljer en slumpmässig rad om det finns flera kamrater. På så sätt anslutningenanchor_id - id
förblir intakt. -
Den yttre frågan aggregerar en 2-dimensionell array som du önskade, sorterad efter
anchor_id
. Om du vill haanchor_id
ordnas slumpmässigt, använd slumpmässigt en gång till:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
Och slutligen,
DISTINCT ON
väljer bara 1groundtruth
perp
, slumpmässigt igen.