sql >> Database >  >> RDS >> PostgreSQL

SQL-optimalisatie nodig (misschien is DISTINCT ON de reden?)

Aggreagate-functie voor multidimensionale arrays

Ik veronderstel dat je een tweedimensionale array maakt daarom. Dat is gemakkelijker te hanteren dan een ARRAY of record . Standaard array_agg() kan geen multidimensionale arrays samenvoegen. Maar daarvoor kun je vrij gemakkelijk je eigen aggregatiefunctie schrijven:

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

Lees de uitleg in dit gerelateerde antwoord:
Gegevens selecteren in een Postgres-array

Zoekopdracht

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();
  • Subquery x krijgt een duidelijke anchor_id per (p, groundtruth) en kiest een willekeurige rij als er meerdere peers zijn. Op deze manier wordt de verbinding anchor_id - id blijft intact.

  • De buitenste query aggregeert een 2-dimensionale array zoals u wenste, geordend op anchor_id . Als u anchor_id . wilt hebben willekeurig besteld, gebruik nogmaals willekeurig:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • En tot slot, de DISTINCT ON kiest slechts 1 groundtruth per p , weer willekeurig.




  1. applicatie verbinding maken met database

  2. Impact op de prestaties van verschillende technieken voor foutafhandeling

  3. Hoe voorkom je dat iemand teruggaat naar de vorige pagina?

  4. Hoe te controleren of een variabele NULL is en deze vervolgens in te stellen met een MySQL-opgeslagen procedure?