Агрегатна функция за многомерни масиви
Предполагам, че създавате двуизмерен масив за това. Това е по-лесно за работа от ARRAY of record
. Стандартен array_agg()
не може да агрегира многоизмерни масиви. Но можете да напишете своя собствена агрегатна функция доста лесно за това:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Прочетете обяснението в този свързан отговор:
Избиране на данни в масив на Postgres
Запитване
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();
-
Подзаявка
x
получава отделенanchor_id
за(p, groundtruth)
и избира произволен ред, ако има няколко партньора. По този начин връзкатаanchor_id - id
остава непокътнат. -
Външната заявка агрегира двуизмерен масив, както желаете, подреден по
anchor_id
. Ако искате да иматеanchor_id
подредени произволно, използвайте произволно още веднъж:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
И накрая,
DISTINCT ON
избира само 1groundtruth
заp
, отново произволно.