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 16/08/2011, 12h38   #1
Invité régulier
 
Inscription : novembre 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 12
Points : 7
Points : 7
Par défaut Maximum date trié par un attribut

Bonjour,

J'ai une table contenant entre autres un id, une date ( YYYY-MM-dd), et un attribut de type character varying:
1, 2011-01-10, F1
2, 2011-01-11, F1
3, 2011-01-10, F2
4, 2011-01-12, F2

je voudrais donc récupérer les lignes qui ont une date la plus avancée pour chaque attribut.
Donc ici :
2, 2011-01-11, F1
4, 2011-01-12, F2

J'arrive bien à récupérer le couple date, attribut :

Code :
SELECT max(date),attribut FROM matable GROUP BY attribut
mais je veux toute la ligne ( j'ai bien sûr d'autres attributs dans ma table).

Si vous pouviez m'aidez

Merci
pindi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 14h47   #2
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 483
Points : 1 483
Admettons que tes colonnes s'appellent c1,c2 et c3

Si tu es en Postgresql 8.4 ou plus, tu peux utiliser les fonctions de fenêtrage :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT c1,c2,c3 FROM
(
SELECT 
RANK() OVER (PARTITION BY c3 ORDER BY c2 DESC) AS rang,
c1,
c2,
c3
FROM la_table
) AS A
WHERE A.rang = 1;
Sinon il faut faire une sous-requête ce qui est un peu moins lisible :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT t.c1, t.c2, t.c3 FROM t, 
(
SELECT 
c3,max(c2) AS max_c2
FROM t
GROUP BY c3
) AS A
WHERE t.c2 = A.max_c2 AND t.c3 = A.c3;
Si tu as d'autres colonnes dans ta table, il faut les énumérer dans les select à côté de 'c1'
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne.
La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/
scheu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2011, 15h35   #3
Invité régulier
 
Inscription : novembre 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 12
Points : 7
Points : 7
Parfait !!!

la seconde solution est pour moi. Je vais exécuter cette requête en JPA.

Merci !
pindi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h51   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Ou encore une autre solution sans les sous-requêtes :
Code :
1
2
3
4
5
SELECT t1.c1, t1.c2, t1.c3 
FROM t AS t1
INNER JOIN t AS t2 ON t1.c3 = t2.c3
GROUP BY t1.c1, t1.c2, t1.c3
HAVING t1.c2 = MAX(t2.c2)
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h20.


 
 
 
 
Partenaires

Hébergement Web