Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/04/2006, 16h37   #1
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 30
Points : 14
Points : 14
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.
++
bdkiller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 16h29   #2
Nouveau Membre du Club
 
Inscription : janvier 2006
Messages : 72
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 72
Points : 35
Points : 35
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
Sakalam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 16h44   #3
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 30
Points : 14
Points : 14
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...)
++
bdkiller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 11h40   #4
Nouveau Membre du Club
 
Inscription : janvier 2006
Messages : 72
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 72
Points : 35
Points : 35
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 :
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
Sakalam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 12h07   #5
Candidat au titre de Membre du Club
 
Inscription : août 2004
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 30
Points : 14
Points : 14
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.
++
bdkiller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 14h27   #6
Nouveau Membre du Club
 
Inscription : janvier 2006
Messages : 72
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 72
Points : 35
Points : 35
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 :
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
Sakalam est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h56.


 
 
 
 
Partenaires

Hébergement Web