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

Har du brug for SQL-optimering (måske er DISTINCT ON årsagen?)

Aggregeringsfunktion til flerdimensionelle arrays

Jeg formoder, at du opretter et todimensionelt array for det. Det er nemmere at håndtere end en ARRAY of record . Standard array_agg() kan ikke samle multidimensionelle arrays. Men du kan skrive din egen aggregerede funktion ret nemt til det:

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

Læs forklaringen i dette relaterede svar:
Valg af data i et Postgres-array

Forespørgsel

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();
  • Underforespørgsel x får distinkt anchor_id per (p, groundtruth) og vælger en tilfældig række, hvis der er flere jævnaldrende. På denne måde forbindelsen anchor_id - id forbliver intakt.

  • Den ydre forespørgsel samler et 2-dimensionelt array, som du ønskede, sorteret efter anchor_id . Hvis du vil have anchor_id ordnet tilfældigt, brug tilfældigt igen:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • Og til sidst, DISTINCT ON vælger kun 1 groundtruth pr. p , tilfældigt igen.




  1. MySQL forbinder to tabel-id'er for at producere resultater fra et bord til et andet

  2. Hvordan håndterer man SQL-kolonnenavne, der ligner SQL-nøgleord?

  3. ActiveRecord::StatementInvalid:PG::Fejl:FEJL:kan ikke udføre UPDATE i en skrivebeskyttet transaktionsfejl i Heroku

  4. Konstanter i Oracle SQL-forespørgsel