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

#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! smile

Merci !

Hors ligne

Pied de page des forums