PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfragetabelle mit array_agg/Median ALLER vorherigen Positionen, LAST_10, LAST_50, ohne aktuelle Position

Postgres hat keine eingebaute Aggregatfunktion für MEDIAN . Sie können jedoch eines erstellen, indem Sie das Funktions-Snippet verwenden, das im Postgres-Wiki verfügbar ist . Dieses Snippet ist auch Teil der benutzerdefinierte Bibliothek ulib_agg .

Sobald es erstellt ist, können Sie es wie jede Aggregatfunktion wie SUM verwenden oder STRING_AGG mit ähnlichem window Spezifikation. Postgres bietet Ihnen die Möglichkeit, mehrere window anzugeben Definitionen für Aggregatfunktionen durch Komma getrennt.

Also, um einen MEDIAN zu erhalten von den vorherigen 20 Datensätzen könnte Ihr Fenster wie in dieser Abfrage definiert werden.

SELECT 
j.* ,  array_agg(position) over w as previous_positions,
       median(position)    over w_20 as med_20
  FROM jockeys j
WINDOW w as
(  partition by name ORDER BY id rows between 
     unbounded preceding and 1 preceding
     ),
     w_20 as
     (  partition by name ORDER BY id rows between 
           20 preceding and 1 preceding
     )

Darüber hinaus können Sie ROUND anwenden Funktion, wenn Sie Dezimalziffern abschneiden möchten.

DEMO