PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Interroger la table avec array_agg/médiane de TOUTES les positions précédentes, LAST_10, LAST_50, à l'exclusion de la position actuelle

Postgres n'a pas de fonction d'agrégation intégrée pour MEDIAN . Mais, vous pouvez en créer un en utilisant l'extrait de fonction disponible dans wiki Postgres . Cet extrait fait également partie de la bibliothèque définie par l'utilisateur ulib_agg .

Une fois créé, vous pouvez l'utiliser comme n'importe quelle fonction d'agrégation comme SUM ou STRING_AGG avec une window similaire spécification. Postgres vous offre la possibilité de spécifier plusieurs window définitions pour les fonctions d'agrégation séparées par une virgule.

Donc, pour obtenir une MEDIAN des 20 enregistrements précédents, votre fenêtre pourrait être définie comme dans cette requête.

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
     )

En plus de cela, vous pouvez appliquer ROUND fonction si vous souhaitez tronquer les chiffres décimaux.

DÉMO