PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQL अनुकूलन की आवश्यकता है (शायद DISTINCT ON इसका कारण है?)

बहु-आयामी सरणियों के लिए समग्र कार्य

मुझे लगता है कि आप एक द्वि-आयामी सरणी बनाते हैं उस के लिए। 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 केवल 1 groundtruth चुनता है प्रति p , बेतरतीब ढंग से फिर से।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. शब्दों की किसी भी सूची के लिए PostgreSQL वाइल्डकार्ड LIKE

  2. Plpgsql में सरणी आयाम पर लूप करें

  3. एक अद्वितीय पूर्णांक के साथ मौजूदा रिकॉर्ड अपडेट करना

  4. मैं PostgreSQL में चाइल्ड टेबल से डेटा कैसे चुनूं?

  5. किसी डेटाबेस के सभी तालिकाओं को एक को छोड़कर, दूसरे db के डेटा से बदलें