PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Perlu optimasi SQL (mungkin DISTINCT ON adalah alasannya?)

Fungsi agregat untuk array multidimensi

Saya kira Anda membuat array dua dimensi untuk itu. Itu lebih mudah ditangani daripada ARRAY of record . array_agg() standar tidak dapat menggabungkan array multidimensi. Tetapi Anda dapat menulis fungsi agregat Anda sendiri dengan lebih mudah untuk itu:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

Baca penjelasannya di jawaban terkait ini:
Memilih data ke dalam larik Postgres

Kueri

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();
  • Subkueri x mendapat anchor_id yang berbeda per (p, groundtruth) dan mengambil baris acak jika ada beberapa rekan. Dengan cara ini koneksi anchor_id - id tetap utuh.

  • Kueri luar menggabungkan larik 2 dimensi seperti yang Anda inginkan, diurutkan berdasarkan anchor_id . Jika Anda ingin memiliki anchor_id dipesan secara acak, gunakan acak sekali lagi:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • Dan akhirnya, DISTINCT ON hanya memilih 1 groundtruth per p , secara acak lagi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara Mengambil id dari baris yang disisipkan saat menggunakan upsert dengan WITH cluse di Posgres 9.5?

  2. Performa penghitungan dan pengurutan Delta E (CIE Lab) dalam SQL

  3. Masalah koneksi SSL antara wadah Go Scratch dan wadah PG. Bagaimana cara mengatasi?

  4. Tanda kutip salah saat menggunakan tab silang () di PostgreSQL

  5. Tuple tidak dimasukkan secara berurutan dalam tabel database?