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.
++
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.
++
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) !
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...)
++
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é :
(ATTENTION, après vérification plus poussée, cette fonction ne marche pas dans tous les cas)
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
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) !
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.
++
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.)
Je suis preneur si quelqu'un trouve qqchose de plus beau.
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;
Sakalam
Marre des blogs trop chiadés ?
http://blog-de-m.over-blog.com/
Enfin, un vrai blog de merde (d'un copain) !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager