SQL selectionner selon un maximum

Résolu/Fermé
batoune Messages postés 538 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 4 avril 2017 - 29 avril 2009 à 11:39
batoune Messages postés 538 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 4 avril 2017 - 29 avril 2009 à 12:18
Bonjour,
J'aurais besoin d'aide pour réaliser une requete SQL,
Je dispose d'une table dans laquel je souhaiterais récuperer les champs suivant :
nom
lieux
numero
Jusque la rien de bien compliqué, mon probleme viens du fait que je ne veux récuperer que les tuples dont les numero sont les plus elevé pour chaque couple nom/lieux. Par exemple si j'ai

nom = pierre, lieu = maison, numero = 5 ==>ligne 1
nom = pierre, lieu = maison, numero = 7 ==>ligne 2
nom = pierre, lieu = travail, numero = 4 ==>ligne 3
nom = pierre, lieu = travail, numero = 6 ==>ligne 4

Je ne voudrais récuperer que les lignes 2 et 4 sans etre obligé de rentrer en dure dans la commande SQL :
WHERE numero = 7 OR numero = 6 car de nouveaux tuples avec de nouveaux numero arrivent régulierement dans la table.
Je ne sais pas si s'est possible a faire avec une requete du genre SELECT MAX numero ..... ou quelque chose comme sa.

Merci d'avance pour vos reponses

2 réponses

chossette9 Messages postés 4239 Date d'inscription lundi 20 avril 2009 Statut Contributeur Dernière intervention 12 septembre 2014 1 308
29 avril 2009 à 11:44
SELECT nom,lieu,MAX(numero)
FROM ta_table
GROUP BY nom,lieu;

Normalement ceci devrait fonctionner.
0
batoune Messages postés 538 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 4 avril 2017 96
29 avril 2009 à 11:53
Ben j'ai deja essayer mais sa me fait une erreur, comme requete j'ai :

SELECT nom, lieu, MAX(numero)
FROM matable
WHERE CAST(FLOOR(CAST(laDate AS FLOAT)) AS DATETIME) = '20090428'
ORDER BY lieu, nom, numero


et j'ai une erreur qui me dit :

La colonne 'matable.nom' est incorrecte dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation et qu'il n'y a pas de clause GROUP BY.

La colonne 'matable.lieu' est incorrecte dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation et qu'il n'y a pas de clause GROUP BY.

La colonne 'matable.numero' n'est pas valide dans la clause ORDER BY parce qu'elle n'est pas contenue dans une fonction d'agrégation et qu'il n'y a aucune clause GROUP BY.
0
batoune Messages postés 538 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 4 avril 2017 96
29 avril 2009 à 12:18
Je progresse, en fesant :

SELECT nom, lieu, MAX(numero)
FROM matable
WHERE CAST(FLOOR(CAST(laDate AS FLOAT)) AS DATETIME) = '20090428'
GROUP BY nom, lieu
ORDER BY lieu, nom

Sa me renvoi un résultat, mais maintenant si je rajoute un autre champ dans le select

SELECT nom, lieu, etat, MAX(numero)
FROM matable
WHERE CAST(FLOOR(CAST(laDate AS FLOAT)) AS DATETIME) = '20090428'
GROUP BY nom, lieu
ORDER BY lieu, nom

Sa me dit que etat n'est pas valide car pas dans la clause GROUP BY mais si je le rajoute dedans sa me renvois le numero max pour les couple(nom/lieu/etat) mais moi je les veux juste pour les couples (nom/lieu) avec l'indication des etats pour chaque couple mais sans que etat entre dans la comparaison pour les numero max
par exemple si j'ai 2couple
nom = pierre, lieu=maison, etat=OK, numero = 6
nom = pierre, lieu=maison, etat=KO, numero = 7
je ne veux que le deuxieme, or avec etat dans la clause group by il me renvoi les 2!!
0