sql >> Databasteknik >  >> RDS >> PostgreSQL

Behöver SQL-optimering (kanske är DISTINCT ON anledningen?)

Aggregeringsfunktion för flerdimensionella arrayer

Jag antar att du skapar en tvådimensionell array för det. Det är lättare att hantera än en ARRAY of record . Standard array_agg() kan inte aggregera flerdimensionella arrayer. Men du kan skriva din egen aggregatfunktion ganska enkelt för det:

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

Läs förklaringen i detta relaterade svar:
Välja data i en Postgres-matris

Fråga

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();
  • Underfråga x får distinkt anchor_id per (p, groundtruth) och väljer en slumpmässig rad om det finns flera kamrater. På så sätt anslutningen anchor_id - id förblir intakt.

  • Den yttre frågan aggregerar en 2-dimensionell array som du önskade, sorterad efter anchor_id . Om du vill ha anchor_id ordnas slumpmässigt, använd slumpmässigt en gång till:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • Och slutligen, DISTINCT ON väljer bara 1 groundtruth per p , slumpmässigt igen.




  1. Oracle SQL - returnera något standardvärde om frågan inte ger resultat

  2. Utdata till CSV i postgres med dubbla citattecken

  3. Oracle PL/SQL:Funktionsmarkör

  4. TANH() Funktion i Oracle