Comment puis-je obtenir min, median et max de ma requête dans postgresql
J'ai écrit une requête dans laquelle une colonne est d'un mois. De ce que j'ai à obtenir min mois de, mois max, et la médiane de mois. Voici ma requête.
select ext.employee,
pl.fromdate,
ext.FULL_INC as full_inc,
prevExt.FULL_INC as prevInc,
(extract(year from age (pl.fromdate))*12 +extract(month from age (pl.fromdate))) as month,
case
when prevExt.FULL_INC is not null then (ext.FULL_INC -coalesce(prevExt.FULL_INC,0))
else 0
end as difference,
(case when prevExt.FULL_INC is not null then (ext.FULL_INC - prevExt.FULL_INC) / prevExt.FULL_INC*100 else 0 end) as percent
from pl_payroll pl
inner join pl_extpayfile ext
on pl.cid = ext.payrollid
and ext.FULL_INC is not null
left outer join pl_extpayfile prevExt
on prevExt.employee = ext.employee
and prevExt.cid = (select max (cid) from pl_extpayfile
where employee = prevExt.employee
and payrollid = (
select max(p.cid)
from pl_extpayfile,
pl_payroll p
where p.cid = payrollid
and pl_extpayfile.employee = prevExt.employee
and p.fromdate < pl.fromdate
))
and coalesce(prevExt.FULL_INC, 0) > 0
where ext.employee = 17
and (exists (
select employee
from pl_extpayfile preext
where preext.employee = ext.employee
and preext.FULL_INC <> ext.FULL_INC
and payrollid in (
select cid
from pl_payroll
where cid = (
select max(p.cid)
from pl_extpayfile,
pl_payroll p
where p.cid = payrollid
and pl_extpayfile.employee = preext.employee
and p.fromdate < pl.fromdate
)
)
)
or not exists (
select employee
from pl_extpayfile fext,
pl_payroll p
where fext.employee = ext.employee
and p.cid = fext.payrollid
and p.fromdate < pl.fromdate
and fext.FULL_INC > 0
)
)
order by employee,
ext.payrollid desc
Si il n'est pas possible qu'est-il possible d'obtenir mois max et min par mois.
source d'informationauteur Deepak Kumar | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
Vous voulez les fonctions d'agrégation nommé
min
etmax
. Voir la documentation PostgreSQL et tutoriel:Il n'y a pas intégré dans médian dans PostgreSQL, cependant, l'un a été mis en œuvre et ont contribué à le wiki:
http://wiki.postgresql.org/wiki/Aggregate_Median
Il est utilisé de la même manière que
min
etmax
une fois que vous avez chargé. Écrit en PL/PgSQL ça va être un peu juste plus lent, mais il y a même une version en C là que vous pourriez adapter si la vitesse était vital.Mise à JOUR Après le commentaire:
Il semble que vous souhaitez afficher les statistiques des agrégats à côté des résultats individuels. Vous ne pouvez pas faire cela avec une simple fonction d'agrégation parce que vous ne pouvez pas faire référence à des colonnes non pas dans le
GROUP BY
dans la liste des résultats.Vous aurez besoin de récupérer les stats de sous-requêtes, ou utiliser votre agrégats, comme les fonctions de la fenêtre.
Compte tenu des données factices:
... et après l'ajout de la médiane globale de la PG wiki:
Vous pouvez le faire avec un simple agrégat:
mais pas cette:
parce que ça n'a pas de sens dans le modèle d'agrégation pour afficher les moyennes, à côté des valeurs. Vous pouvez afficher les groupes:
... mais il semble que vous voulez que les valeurs individuelles. Pour cela, vous devez utiliser un fenêtreune nouvelle fonction dans PostgreSQL 8.4.
Voir aussi:
Pour calculer la médiane dans postgresql, il suffit de prendre le centile de 50%, pas besoin d'ajouter des fonctions supplémentaires ou quoi que ce soit.