Agregační funkce pro vícerozměrná pole
Předpokládám, že vytvoříte dvourozměrné pole pro to. To je snazší zvládnout než ARRAY of record
. Standardní array_agg()
neumí agregovat vícerozměrná pole. Ale pro to můžete poměrně snadno napsat svou vlastní agregační funkci:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Přečtěte si vysvětlení v této související odpovědi:
Výběr dat do pole Postgres
Dotaz
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();
-
Poddotaz
x
získá odlišnéanchor_id
za(p, groundtruth)
a vybere náhodný řádek, pokud existuje více vrstevníků. Tímto způsobem spojeníanchor_id - id
zůstane nedotčena. -
Vnější dotaz agreguje 2-rozměrné pole, jak jste si přáli, seřazené podle
anchor_id
. Pokud chcete mítanchor_id
seřazeno náhodně, použijte random ještě jednou:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
A nakonec
DISTINCT ON
vybere pouze 1groundtruth
zap
, opět náhodně.