Fonction MAX [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 18-10-2004 à 15:11:25
Tu peux pas t'en tirer avec un group by?
Marsh Posté le 18-10-2004 à 15:11:30
ça me semble difficile à faire en SQL pur. Dans le cas où tu n'aurais qu'un seul nom, la requête serait la suivante:
SELECT identifiant |
Marsh Posté le 18-10-2004 à 15:13:05
mareek a écrit : ça me semble difficile à faire en SQL pur. Dans le cas où tu n'aurais qu'un seul nom, la requête serait la suivante:
|
max fait pas partie des fonctions group-by-ables?
Marsh Posté le 18-10-2004 à 15:15:50
SELECT [Similarite2].nom,MAX([Similarite2].Num) FROM Similarite2 GROUP BY [Similarite2].nom;
Ca me permet de selectionner tous les differents noms selon la valeur max, si je veux recuperer l'identifiant, access m'emmerde a vouloir ajouter l'identifiant dans le group by, et dans ce cas la j'ai tous les lignes.
Marsh Posté le 18-10-2004 à 15:16:34
skeye a écrit : max fait pas partie des fonctions group-by-ables? |
Peut-être, j'en sais rien.
j'avoues que je suis assez nul en group by et qu'il faut que je me réfère à la DOC à chaque fois que j'en ai besoin /o\ .
Marsh Posté le 18-10-2004 à 15:18:24
select nom, identifiant from table
where (nom,valeur) in
(select nom, max(valeur) from table group by nom)
Marsh Posté le 18-10-2004 à 15:21:22
mareek a écrit : Peut-être, j'en sais rien. |
J'ai tjrs la doc à portée de main, mais je commence à m'habituer, là...
Marsh Posté le 18-10-2004 à 15:22:19
skeye a écrit : select nom, identifiant from table |
J'ai eja essaye mais access ne veut rien entendre parler, il veut un EXISTS.-----> A cause du MAX dans la deuxieme partie du 'IN'
Marsh Posté le 18-10-2004 à 15:26:44
J'ai pas d'access sous la main pour tester...
Mais je vois pas trop le rapport avec exists là pour le coup...
Ou alors un truc du style :
Code :
|
Marsh Posté le 18-10-2004 à 15:33:52
Question : Identifiant est unique ou pas ?
Je veux dire...
Est-ce que tu as :
1 - TOTO - 25
2 - TOTO - 42
3 - TITI - 12
4 - TRUC - 69
Ou bien :
1 - TOTO - 25
1 - TOTO - 42
2 - TITI - 12
3 - TRUC - 69
Dans le cas 2 :
SELECT ID, NOM, MAX(VALEUR) |
Dans le cas 1, c'est plus compliqué :
select max(e1.ID), e1.NOM, e1.VALEUR |
PS: le "max(e1.ID)" c'est au cas où deux lignes pour un même utilisateur aient la même valeur, sinon la requête te ressort un doublon.
Marsh Posté le 18-10-2004 à 15:35:32
un distinct alors...
Marsh Posté le 18-10-2004 à 15:36:51
skeye a écrit :
|
Ca marche aussi
Testé avec une base que j'avais sous la main :
select e1.sigtie, e1.numeve, e1.typeve |
001610 860007 CDE |
C'est le même résultat que ma requête
Marsh Posté le 18-10-2004 à 15:37:29
KangOl a écrit : un distinct alors... |
Non, car si l'hypothèse du ID différent pour chaque ligne, le distinct ne fera abssolument rien (et à ce moment la première solution est bien plus simple)
Marsh Posté le 18-10-2004 à 15:38:11
distinct sur le nom...
Marsh Posté le 18-10-2004 à 15:38:31
KangOl a écrit : distinct sur le nom... |
Le distinct n'est pas sélectif
(à part peut-être avec MySQL qui piétine alègrement sur la norme SQL92)
Marsh Posté le 18-10-2004 à 15:38:40
Arjuna a écrit : Ca marche aussi
|
Marsh Posté le 18-10-2004 à 15:39:31
'nom n' ou bien 'valeur v', le fait de renommer une colonne n'est pas accepte pas access.
Marsh Posté le 18-10-2004 à 15:39:45
nam2 a écrit : 'nom n' ou bien 'valeur v', le fait de renommer une colonne n'est pas accepte pas access. |
Ha si...
Faut juste écrire selon la norme SQL92 :
SELECT PROUT AS POUET FROM MATABLE AS ALIAS
Marsh Posté le 18-10-2004 à 15:40:08
nam2 a écrit : 'nom n' ou bien 'valeur v', le fait de renommer une colonne n'est pas accepte pas access. |
cf la réponse d'arjuna, je m'ai planté, c'est évidemment la table qu'il faut aliaser, pas les champs...
Marsh Posté le 18-10-2004 à 15:40:30
skeye a écrit : cf la réponse d'arjuna, je m'ai planté, c'est évidemment la table qu'il faut aliaser, pas les champs... |
J'ai répondu pour les deux, puisque de toute façon Access accèpte les alias pour les deux
Marsh Posté le 18-10-2004 à 15:41:24
Arjuna a écrit : J'ai répondu pour les deux |
ça passe aussi en aliasant les champs?
(j'ai rien pour tester là...flemme de chercher ou est planquée la base de test...)
Marsh Posté le 18-10-2004 à 15:41:52
skeye a écrit : ça passe aussi en aliasant les champs? |
Ta requête telle que tu l'as écrite, non, je te rassure Y'a que dans ton cerveau que ça marche
Mais pour ma requête, il suffit de mettre des "AS" entre le nom physique et l'alias et ça marche, que ce soit pour les tables ou les champs
Marsh Posté le 18-10-2004 à 15:42:21
Arjuna a écrit : Ta requête telle que tu l'as écrite, non, je te rassure Y'a que dans ton cerveau que ça marche |
C'est bien ce qu'il me semblait...
Marsh Posté le 18-10-2004 à 15:42:51
nam2 a écrit : L'identifiant est different pour chaque ligne |
Bon, ben donc la réponse de skeye ou ma seconde marchent toutes les deux.
Marsh Posté le 18-10-2004 à 15:43:57
Avec un alias il ouvre une boite et me demande de saisir une valeur
Marsh Posté le 18-10-2004 à 15:44:58
nam2 a écrit : Avec un alias il ouvre une boite et me demande de saisir une valeur |
cf la version corrigée par arjuna de ma solution...
Marsh Posté le 18-10-2004 à 16:37:35
Un petit conseil n'essayait pas sur un pc de 64Mo de RAM, apres 1H vous n'aurez toujours pas de reponse.
Marsh Posté le 18-10-2004 à 16:43:58
nam2 a écrit : Un petit conseil n'essayait pas sur un pc de 64Mo de RAM, apres 1H vous n'aurez toujours pas de reponse. |
1) T'as combien de lignes ?
2) T'as essayé quelle requête ? Je pense que celle de Skeye est plus rapide que la mienne, mais rien n'est sûr, les deux sont à tester en tout cas
Ca me paraît quand même bizarre que tu aies autant de lignes...
Marsh Posté le 18-10-2004 à 15:05:43
Bonjour,
Un petit probleme se pose a moi. Si ce n'est pas une erreur de code c'est une erreur de resultat. Je commence a tourner en rond.
J'ai une table, 3 colonnes : nom, identifiant, valeur.
En fait j'aimerais recuperer tous les noms avec leur identifiant pour les valeurs maximum pour chaque differents nom.
En quelques sortent si j'avais qu'un seul nom ce serait de recuperer l'identifiant pour la valeur maximal. Mais le fait de vouloir executer ceci pour chaque different nom me pose quelques petits pb.
Si quelqu'un a une idee, je pourrais eviter de devenir chauve?
Merci