PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Нуждаете се от SQL оптимизация (може би DISTINCT ON е причината?)

Агрегатна функция за многомерни масиви

Предполагам, че създавате двуизмерен масив за това. Това е по-лесно за работа от ARRAY of record . Стандартен array_agg() не може да агрегира многоизмерни масиви. Но можете да напишете своя собствена агрегатна функция доста лесно за това:

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

Прочетете обяснението в този свързан отговор:
Избиране на данни в масив на Postgres

Запитване

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 . Ако искате да имате 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. как да изберете само уникални стойности от свързани таблици

  2. Как да използвам задействания „за изявление“ в postgres?

  3. Обемът на Docker не запазва данни

  4. Какъв е еквивалентът на LISTAGG (база данни Oracle) в PostgreSQL?

  5. превърнете отделната стойност на колони в редове postgres