sql >> Databáze >  >> RDS >> PostgreSQL

Potřebujete optimalizaci SQL (možná je důvodem DISTINCT ON?)

Agregační funkce pro vícerozměrná pole

Předpokládám, že vytvoříte dvourozměrné pole pro to. To je snazší zvládnout než ARRAY of record . Standardní array_agg() neumí agregovat vícerozměrná pole. Ale pro to můžete poměrně snadno napsat svou vlastní agregační funkci:

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

Přečtěte si vysvětlení v této související odpovědi:
Výběr dat do pole Postgres

Dotaz

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();
  • Poddotaz x získá odlišné anchor_id za (p, groundtruth) a vybere náhodný řádek, pokud existuje více vrstevníků. Tímto způsobem spojení anchor_id - id zůstane nedotčena.

  • Vnější dotaz agreguje 2-rozměrné pole, jak jste si přáli, seřazené podle anchor_id . Pokud chcete mít anchor_id seřazeno náhodně, použijte random ještě jednou:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • A nakonec DISTINCT ON vybere pouze 1 groundtruth za p , opět náhodně.




  1. ScaleGrid DBaaS v užším výběru pro Cloud Excellence Awards 2018

  2. Jak provedu ruční odinstalaci Oracle?

  3. Jak získat data z databáze mysql pomocí javascriptu?

  4. Podmíněná vložka na základě LAST_INSERT_ID