PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 07/03/2015 18:30:06

Logiquefloue
Membre

Fusionner(joindre)les résultats d'une requête

Bonjour,

J'ai la table suivante :
mesure :
objet    dateM                 valeur

obj1     2013-01-01       4
obj2     2014-02-15       2
obj1     2010-09-14       5
obj2     2011-12-25       10
obj1     2008-01-25       25

Je cherche à trouver les valeurs des deux plus récentes dates pour chaque objet et afficher le résultat sur une seule ligne. Voici le résultat attendu :

objet    dateM1                 valeur1       dateM2              valeur2

obj1     2013-01-01          4                 2010-09-14        5
obj2     2014-02-15          2                 2011-12-25       10


Avec le code ci-dessous, j'arrive à trouver les bonnes valeurs mais sur 2 lignes. J'ai aussi essayer les jointures sans succès!

SELECT objet, dateM, valeur FROM mesure ORDER BY dateM DESC LIMIT 2 OFFSET 0

Merci de votre aide.

Hors ligne

#2 10/03/2015 01:39:40

rjuju
Administrateur

Re : Fusionner(joindre)les résultats d'une requête

Bonjour,

Le plus simple serait d'utiliser l'extension tablefunc, notamment la fonction crosstab, voir http://docs.postgresql.fr/9.4/tablefunc.html .

Hors ligne

#3 12/03/2015 10:38:47

Logiquefloue
Membre

Re : Fusionner(joindre)les résultats d'une requête

Bonjour,
Merci Julien pour ta réponse. Effectivement, la fonction "crosstab" répond parfaitement à ce qu'est recherché. Voici le code complet de la requête pour les lecteurs intéressés.(test fait sur une bd locale)

SELECT * FROM crosstab('SELECT objet, dateM, valeur FROM mesure ORDER BY dateM DESC LIMIT 2 OFFSET 0')AS ct (objet text, dateM double precision, valeur double precision);

L'utilisation de cette fonction est possible qu'après l'installation de l'extension "tablefunc". Ma base de données est hébergée sur un serveur mutualisé. Je pense que l'extension n'est pas installée sur le serveur et donc je n'arrive pas à exécuter la fonction "crosstab". Comment ça se passe dans le cas d'un serveur mutualisé, c'est à l'hébergeur d'installer les extensions de Postgresql ?
Merci.

Hors ligne

#4 12/03/2015 11:27:13

rjuju
Administrateur

Re : Fusionner(joindre)les résultats d'une requête

Les extensons sont à créer sur chacune des bases applicatives nécessaire. Quelle erreur rencontrez-vous ? Un manque de droit pour créer l'extension ou le fait que l'extension n'existe pas ? Si l'extension n'existe pas (voir la vue pg_available_extensions), lil faut que l'hébergeur installe les contrib.

Hors ligne

#5 12/03/2015 11:43:05

Logiquefloue
Membre

Re : Fusionner(joindre)les résultats d'une requête

Depuis PgAdmin, pour la création de l'extension, j'exécute le code suivant sur ma bd hébergée :

 CREATE EXTENSION tablefunc
  SCHEMA public
  VERSION "1.0";

Voici le message d'erreur

ERROR:  syntax error at or near "EXTENSION"
LINE 5:  CREATE EXTENSION tablefunc

La vue "pg_available_extensions" n'est pas dans la liste des vues présentes sur ma bd hébergée.

Dernière modification par Logiquefloue (12/03/2015 11:53:03)

Hors ligne

#6 12/03/2015 12:10:58

rjuju
Administrateur

Re : Fusionner(joindre)les résultats d'une requête

Les extensions sont apparues dans la version 9.1. En quelle version est votre serveur ?

Si les contrib sont disponible, il suffit de jouer le script tablefunc.sql associé la version majeure de votre instance. Par exemple pour la version 9.0 : https://raw.githubusercontent.com/postg … unc.sql.in

Hors ligne

#7 12/03/2015 12:55:02

Logiquefloue
Membre

Re : Fusionner(joindre)les résultats d'une requête

C'est la version 9.0.13 qui est installée.
Quand j'execute le code :

-- the generic crosstab function:
CREATE OR REPLACE FUNCTION crosstab(text)
RETURNS setof record
AS 'MODULE_PATHNAME','crosstab'
LANGUAGE C STABLE STRICT;

J'ai l'erreur "permission denied for language c" !

Dernière modification par Logiquefloue (12/03/2015 13:21:27)

Hors ligne

#8 12/03/2015 14:04:41

gleu
Administrateur

Re : Fusionner(joindre)les résultats d'une requête

Il faut être superutilisateur pour ajouter une fonction en langage C.


Guillaume.

Hors ligne

#9 12/03/2015 16:15:32

Logiquefloue
Membre

Re : Fusionner(joindre)les résultats d'une requête

Très bien, je vais voir cela avec l'hébergeur.
Merci de votre aide smile

Hors ligne

Pied de page des forums