PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Hai bisogno di ottimizzazione SQL (forse DISTINCT ON è il motivo?)

Funzione di aggregazione per array multidimensionali

Suppongo che crei un array bidimensionale per quello. È più facile da gestire di un ARRAY of record . Standard array_agg() non può aggregare array multidimensionali. Ma puoi scrivere la tua funzione di aggregazione piuttosto facilmente per questo:

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

Leggi la spiegazione in questa risposta correlata:
Selezione dei dati in un array Postgres

Interrogazione

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();
  • Sottoquery x ottiene anchor_id distinto per (p, groundtruth) e seleziona una riga casuale se sono presenti più peer. In questo modo la connessione anchor_id - id rimane intatto.

  • La query esterna aggrega un array bidimensionale come desideri, ordinato per anchor_id . Se vuoi avere anchor_id ordinato a caso, usa ancora una volta casuale:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • E infine, il DISTINCT ON sceglie solo 1 groundtruth per p , di nuovo in modo casuale.