Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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 .
Julien.
https://rjuju.github.io/
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.
Julien.
https://rjuju.github.io/
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
Julien.
https://rjuju.github.io/
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
Hors ligne
Pages : 1