बहु-आयामी सरणियों के लिए समग्र कार्य
मुझे लगता है कि आप एक द्वि-आयामी सरणी बनाते हैं उस के लिए। ARRAY of record
. की तुलना में इसे संभालना आसान है . मानक array_agg()
बहु-आयामी सरणियों को एकत्र नहीं कर सकता। लेकिन आप इसके लिए अपना खुद का समग्र कार्य आसानी से लिख सकते हैं:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
इस संबंधित उत्तर में स्पष्टीकरण पढ़ें:
पोस्टग्रेज एरे में डेटा का चयन करना
क्वेरी
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
. द्वारा आदेशित, आपके इच्छित 2-आयामी सरणी को एकत्रित करती है . अगर आपanchor_id
चाहते हैं बेतरतीब ढंग से आदेश दिया, एक बार फिर यादृच्छिक का उपयोग करें:array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
-
और अंत में,
DISTINCT ON
केवल 1groundtruth
चुनता है प्रतिp
, बेतरतीब ढंग से फिर से।