PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Potrzebujesz optymalizacji SQL (może powodem jest DISTINCT ON?)

Funkcja agregująca dla tablic wielowymiarowych

Przypuszczam, że tworzysz tablicę dwuwymiarową za to. Łatwiej to obsłużyć niż ARRAY of record . Standardowa array_agg() nie może agregować tablic wielowymiarowych. Ale w tym celu możesz dość łatwo napisać własną funkcję agregującą:

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

Przeczytaj wyjaśnienie w tej powiązanej odpowiedzi:
Wybieranie danych do tablicy Postgres

Zapytanie

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();
  • Podzapytanie x otrzymuje odrębny anchor_id na (p, groundtruth) i wybiera losowy rząd, jeśli jest wielu rówieśników. W ten sposób połączenie anchor_id - id pozostaje nienaruszony.

  • Zewnętrzne zapytanie agreguje dwuwymiarową tablicę, jak sobie życzyłeś, uporządkowaną według anchor_id . Jeśli chcesz mieć anchor_id uporządkowane losowo, użyj jeszcze raz losowo:

    array_agg_mult(ARRAY[ARRAY[anchor_id, id]] ORDER BY random())
    
  • I wreszcie DISTINCT ON wybiera tylko 1 groundtruth na p , ponownie losowo.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd składni PostgreSQL w sparametryzowanym zapytaniu w dniu $1

  2. wzorce migracji danych produkcyjnych w ciągłej dostawie

  3. Prawidłowe wstawienie nazwy tabeli

  4. Dlaczego nie mogę zainstalować psycopg2? (Python 2.6.4, PostgreSQL 8.4, OS X 10.6.3)

  5. Jak utworzyć użytkownika za pomocą pgAdmin