IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Fonction aggrégat pour la médiane et les quantiles


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 30
    Points
    30
    Par défaut Fonction aggrégat pour la médiane et les quantiles
    Bonjour,
    Quelqu'un a-t-il déjà implémenté une fonction d'aggrégat pour calculer les quantiles d'un jeu de données (médiane, q33, q66 ...) au meme titre que 'avg' ou 'sum' ?
    Merci.
    ++

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Points : 64
    Points
    64
    Par défaut
    J'ai écrit d'autres agrégats, mais pas ceux-là.
    C'est très simple.
    Il faut que les fonctions qui t'intéressent soient définies en tant que fonctions SQL, puis il faut définir l'agrégat en tant que tel (voir dans l'aide "user defined aggregates" je crois).

    L'appel s'effectue comme pour un agrégat prédéfini.

    J'espère que cela va t'aider.

    Amicalement

    Sakalam
    Marre des blogs trop chiadés ?
    http://blog-de-m.over-blog.com/
    Enfin, un vrai blog de merde (d'un copain) !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Merci pour ta réponse.
    Moi aussi j'ai déjà créé des agrégats et j'en suis sorti vivant.
    Par contre, pour les quantiles, je n'ai pas trop d'idée sur l'algorithme d'agrégation à utiliser et je me demandais si quelqu'un l'avait déjà implémenté (d'autant que ca existe en standard pour d'autres sgbd...)
    ++

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Points : 64
    Points
    64
    Par défaut
    Désolé, je croyais que ta question portait sur les agrégats...

    Sinon, pour les fonctions statistiques qui t'intéressent, je ne pense pas que tu aies besoin d'agrégats.

    J'ai trouvé sur internet une astuce de chacal en SQL pur et traditionnel (uniquement pour la médiane) qui marche pour un effectif pair ou impair !!! Je l'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Avg(median)  FROM
    (
    SELECT x.value AS median
    FROM vals AS x, vals AS y
    GROUP BY x.value
    HAVING SUM(SIGN(x.value-y.value)) IN (1,0,-1)
    )AS median
    (ATTENTION, après vérification plus poussée, cette fonction ne marche pas dans tous les cas)

    Sinon pour les autres fonctions (déciles, quartiles etc.) je crois que tu es obligé de passer par une fonction pl/pgsql.

    Amicalement

    Sakalam
    Marre des blogs trop chiadés ?
    http://blog-de-m.over-blog.com/
    Enfin, un vrai blog de merde (d'un copain) !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Oui. Reste plus qu' à la faire :)

    Je sais que le mieux est encore d'utiliser le module PL/R qui permet d'utiliser R à l'intérieur de PostGres. Comme R est un outil puissant pour faire des statistiques, on peut utiliser directement la fonctions quantile et tous ses amis.

    C'est plus vers ce genre de solution que je voudrais me diriger, mais je n'ai pas réussi à l'installer.
    Merci pour ton aide.
    ++

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 71
    Points : 64
    Points
    64
    Par défaut
    J'ai fait un truc mais il faudrait tenir compte des effectifs pairs/impairs, mais ca te donnera une idée (pour avoir la médiane, il faut entrer 50, pour le premier décile : 10 etc.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CREATE OR REPLACE FUNCTION centile(numeric) RETURNS INTEGER AS '
    DECLARE
        ratio ALIAS FOR $1;
        valeur integer;
    	n integer;
    indice integer;
    reg record;
    BEGIN
    	SELECT INTO n count(*) FROM vals ;
    	indice=floor((n+1)*(ratio/100));
    SELECT INTO reg * FROM vals ORDER BY value LIMIT 1 OFFSET (indice-1) ;
    valeur = reg.value;
    RETURN valeur;
    END;
    ' LANGUAGE plpgsql;
    Je suis preneur si quelqu'un trouve qqchose de plus beau.

    Sakalam
    Marre des blogs trop chiadés ?
    http://blog-de-m.over-blog.com/
    Enfin, un vrai blog de merde (d'un copain) !

Discussions similaires

  1. [AJAX] [vos avis] fonction "générique" pour les requetes
    Par gorgonite dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/07/2007, 19h40
  2. fonction bioskey pour les nouveaux ordinateurs ?
    Par as-de-trefle dans le forum C
    Réponses: 3
    Dernier message: 19/01/2007, 11h25
  3. Réponses: 8
    Dernier message: 29/06/2006, 15h37
  4. barre de recherche dans les fonctions php pour firefox
    Par titoumimi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 03/02/2006, 10h16
  5. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo