Hàm tổng hợp cho mảng nhiều chiều
Tôi cho rằng bạn tạo mảng hai chiều cho điều đó. Điều đó dễ dàng hơn để xử lý so với một ARRAY of record . Chuẩn array_agg() không thể tổng hợp các mảng nhiều chiều. Nhưng bạn có thể viết hàm tổng hợp của riêng mình khá dễ dàng cho điều đó:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Đọc giải thích trong câu trả lời có liên quan này:
Chọn dữ liệu vào mảng Postgres
Truy vấn
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();
-
Truy vấn con
xnhận đượcanchor_idkhác biệt per(p, groundtruth)và chọn một hàng ngẫu nhiên nếu có nhiều hàng ngang hàng. Bằng cách này, kết nốianchor_id - idvẫn còn nguyên vẹn. -
Truy vấn bên ngoài tổng hợp một mảng 2 chiều như bạn mong muốn, được sắp xếp theo
anchor_id. Nếu bạn muốn cóanchor_idđặt hàng ngẫu nhiên, sử dụng ngẫu nhiên một lần nữa:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random()) -
Và cuối cùng,
DISTINCT ONchỉ chọn 1groundtruthperp, một lần nữa ngẫu nhiên.