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

Agrégation par valeur médiane en SQL

Vous pouvez utiliser les fonctions de fenêtre. En supposant qu'il s'agit d'une valeur numérique :

select cobrand_id, avg(xsum) as median
from (select m.*,
             row_number() over (partition by cobrand_id order by xsum) as seqnum,
             count(*) over (partition by cobrand_id) as cnt
      from tmp_median m
     ) m
where 2*seqnum in (cnt, cnt + 1, cnt + 2)
group by cobrand_id;

Le where la clause filtre les lignes sur 1 ou 2 pour chaque cobrand_id (notez le 2* ), cela fonctionne donc pour les nombres pairs et impairs dans chaque partition. La moyenne de ces valeurs est alors la médiane.