Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 01/10/2010 11:20:10
- d.guillerme
- Membre
Fonction d'agrégat "produit"
Bonjour,
Existe-t-il dans postgresql une fonction d'agrégat permettant de faire un produit des valeurs d'un champ dans une table, un peu de la même manière que Sum permet de faire une somme?
Une fonction du genre: "select prod(champ_nb) from T group by champ_x"
avec comme résultat le produit des valeurs de champ_nb. Exemple
Code :
champ_x | champ_nb
A 2
A 5
A 4
A 3
B 2
B 6
B 2
Résultat:
A 120 (2*5*4*3)
B 24 (2*6*2)
Une solution est possible en passant par l'exponentielle de la somme des logarithmes des enregistrements "exp(sum(ln(x)))". Mais cette opération n'est pas vraiment satisfaisante dans les cas ou certains enregistrements ont une valeur nulle et renvoie donc systématiquement une erreur.
Bien cordialement.
Hors ligne
#2 01/10/2010 11:27:06
- Marc Cousin
- Membre
Re : Fonction d'agrégat "produit"
Cette fonction n'existe pas. Toutefois, écrire une nouvelle fonction d'aggrégat de ce type est trivial.
Je vous redirige sur la doc : http://docs.postgresql.fr/9.0/sql-createaggregate.html
Si vous avez d'autres questions, n'hésitez pas à les poser.
Par ailleurs, calculer des logarithmes et des exposants est une opération assez coûteuse, vous avez donc plutôt intérêt à écrire cette fonction d'aggrégat.
Marc.
Hors ligne
#3 04/10/2010 13:43:15
- d.guillerme
- Membre
Re : Fonction d'agrégat "produit"
Bonjour à tous,
Une solution m'a été proposé :
CREATE AGGREGATE mmul(int4)
(
sfunc = int4mul,
stype = int4
);
Le problème est que la fonction utilisée n'est opérationnelle que sur des nombres entiers. Existe t'il une fonction similaire permettant l'utilisation de nombres réels?
Hors ligne
#4 04/10/2010 13:51:31
- Marc Cousin
- Membre
Re : Fonction d'agrégat "produit"
Bien sûr :
sfunc = numeric_mul,
stype = numeric
Marc.
Hors ligne
#5 04/10/2010 13:58:38
- d.guillerme
- Membre
Re : Fonction d'agrégat "produit"
Super tout marche très bien maintenant!
Merci !
Hors ligne
Pages : 1