PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : PL/pgSQL » Calcule d'une médiane sous postGreSql » 11/11/2019 23:44:22

dverite a écrit :

Pour un calcul de médiane tout fait en postgresql moderne, on peut utiliser percentile_cont ou percentile_disc.
Voir https://forums.postgresql.fr/viewtopic.php?id=4218

tout simplement en fait.
un grand grand merci !!!

#2 Re : PL/pgSQL » Calcule d'une médiane sous postGreSql » 11/11/2019 23:02:43

Bonjour,
merci beaucoup.
C'est déjà beaucoup plus clair (et presque évident avec l'explication) sur le fonctionnement du code dont je disposais.
Je vais tester tout cela et je vous tiens au courant.

Stéphane

#3 PL/pgSQL » Calcule d'une médiane sous postGreSql » 10/11/2019 23:11:22

slenoble
Réponses : 4

Bonjour à tous,
je suis confronté à un problème qui me semblait simple à la base mais qui au final me bloque depuis quelques temps.
J'ai besoin de calculé une médiane sur un champs d'une table.
J'ai trouvé un code qui fait presque le travail (sur Postgre version au dela de 10) :

CREATE OR REPLACE FUNCTION _final_median(NUMERIC[])
   RETURNS NUMERIC AS
$$
   SELECT AVG(val)
   FROM (
     SELECT val
     FROM unnest($1) val
     ORDER BY 1
     LIMIT  2 - MOD(array_upper($1, 1), 2)
     OFFSET CEIL(array_upper($1, 1) / 2.0) - 1
   ) sub;
$$
LANGUAGE 'sql' IMMUTABLE;

CREATE AGGREGATE median(NUMERIC) (
  SFUNC=array_append,
  STYPE=NUMERIC[],
  FINALFUNC=_final_median,
  INITCOND='{}'
);


Je dis que ça fait presque le job car j'ai un pb de valeur manquante …. cette fonction, considère les valeurs "NULL" comme une modalité … je voudrais la même chose mais en ne tenant pas compte des valeurs NULL.

J'ai un niveau de base en SQL, et je n'ai jusque là jamais crée de fonction, du coup j'avoue ne pas tout comprendre au code ci-dessus.

Est ce que quelqu'un peut m'aider ?

Merci beaucoup par avance,

Stéphane

Pied de page des forums

Propulsé par FluxBB