Funkcja agregująca dla tablic wielowymiarowych
Przypuszczam, że tworzysz tablicę dwuwymiarową za to. Łatwiej to obsłużyć niż ARRAY of record
. Standardowa array_agg()
nie może agregować tablic wielowymiarowych. Ale w tym celu możesz dość łatwo napisać własną funkcję agregującą:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Przeczytaj wyjaśnienie w tej powiązanej odpowiedzi:
Wybieranie danych do tablicy Postgres
Zapytanie
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();
-
Podzapytanie
x
otrzymuje odrębnyanchor_id
na(p, groundtruth)
i wybiera losowy rząd, jeśli jest wielu rówieśników. W ten sposób połączenieanchor_id - id
pozostaje nienaruszony. -
Zewnętrzne zapytanie agreguje dwuwymiarową tablicę, jak sobie życzyłeś, uporządkowaną według
anchor_id
. Jeśli chcesz miećanchor_id
uporządkowane losowo, użyj jeszcze raz losowo:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
I wreszcie
DISTINCT ON
wybiera tylko 1groundtruth
nap
, ponownie losowo.