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
x
nhận đượcanchor_id
khá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 - id
vẫ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 ON
chỉ chọn 1groundtruth
perp
, một lần nữa ngẫu nhiên.