PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cần tối ưu hóa SQL (có thể là lý do DISTINCT ON?)

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 được anchor_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ối anchor_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 1 groundtruth per p , một lần nữa ngẫu nhiên.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo cơ sở dữ liệu Postgres bằng python

  2. Làm thế nào để chia một giá trị thành nhiều hàng trên ký tự dòng mới trong PostgreSQL?

  3. Vấn đề với Sqlalchemy và chèn mảng jsonb vào postgresql

  4. Nhóm theo ngày, với 0 khi count () không có dòng nào

  5. Tạo trình kích hoạt để chèn bảng con trả về lỗi khó hiểu