[SQL] Fonction MAX

Fonction MAX [SQL] - SQL/NoSQL - Programmation

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

Reply

Marsh Posté le 18-10-2004 à 15:05:43   

Reply

Marsh Posté le 18-10-2004 à 15:11:25    

Tu peux pas t'en tirer avec un group by?


---------------
Can't buy what I want because it's free -
Reply

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
FROM MaTable
WHERE Nom='trucmuche' AND Valeur in (SELECT MAX(Valeur) FROM MaTable WHERE Nom='trucmuche')


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

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:

SELECT identifiant
FROM MaTable
WHERE Nom='trucmuche' AND Valeur in (SELECT MAX(Valeur) FROM MaTable WHERE Nom='trucmuche')




max fait pas partie des fonctions group-by-ables?


Message édité par skeye le 18-10-2004 à 15:13:16

---------------
Can't buy what I want because it's free -
Reply

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.

Reply

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\ .


Message édité par mareek le 18-10-2004 à 15:18:49

---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

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)
 
:??:


Message édité par skeye le 18-10-2004 à 15:18:58

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-10-2004 à 15:21:22    

mareek a écrit :

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\ .


J'ai tjrs la doc à portée de main, mais je commence à m'habituer, là...[:ddr555]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-10-2004 à 15:22:19    

skeye a écrit :

select nom, identifiant from table
where (nom,valeur) in
(select nom, max(valeur) from table group by nom)


 
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'


Message édité par nam2 le 18-10-2004 à 15:25:09
Reply

Marsh Posté le 18-10-2004 à 15:26:44    

:heink:
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 :
  1. select nom n, identifiant, valeur v
  2. from table
  3. where not exists
  4. (
  5. select nom n2, valeur v2 from table
  6. where v2 > v
  7. and n2 = n
  8. )


Message édité par skeye le 18-10-2004 à 15:30:26

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-10-2004 à 15:26:44   

Reply

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)
FROM LATABLE
GROUP BY ID, NOM


 
Dans le cas 1, c'est plus compliqué :
 

select max(e1.ID), e1.NOM, e1.VALEUR  
from LATABLE e1
where e1.VALEUR = (select max(e2.VALEUR) from LATABLE e2 where e2.NOM = e1.NOM)
group by 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.


Message édité par Arjuna le 18-10-2004 à 15:34:18
Reply

Marsh Posté le 18-10-2004 à 15:35:32    

un distinct alors...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 18-10-2004 à 15:36:51    

skeye a écrit :

:heink:
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 :
  1. select nom n, identifiant, valeur v
  2. from table
  3. where not exists
  4. (
  5. select nom n2, valeur v2 from table
  6. where v2 > v
  7. and n2 = n
  8. )




 
Ca marche aussi :jap:
 
Testé avec une base que j'avais sous la main :
 

select e1.sigtie, e1.numeve, e1.typeve  
from eve e1
where not exists  
(  
select e2.typeve, e2.numeve from eve e2  
where e2.numeve > e1.numeve  
and e2.typeve = e1.typeve
)


 

001610 860007 CDE
001610 860042 BSK
000068 850008 SAV


 
C'est le même résultat que ma requête :)

Reply

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)


Message édité par Arjuna le 18-10-2004 à 15:37:44
Reply

Marsh Posté le 18-10-2004 à 15:38:11    

distinct sur le nom... :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 18-10-2004 à 15:38:31    

KangOl a écrit :

distinct sur le nom... :o


Le distinct n'est pas sélectif :o
(à part peut-être avec MySQL qui piétine alègrement sur la norme SQL92)


Message édité par Arjuna le 18-10-2004 à 15:39:00
Reply

Marsh Posté le 18-10-2004 à 15:38:40    

Arjuna a écrit :

Ca marche aussi :jap:
 
Testé avec une base que j'avais sous la main :
 

select e1.sigtie, e1.numeve, e1.typeve  
from eve e1
where not exists  
(  
select e2.typeve, e2.numeve from eve e2  
where e2.numeve > e1.numeve  
and e2.typeve = e1.typeve
)


 

001610 860007 CDE
001610 860042 BSK
000068 850008 SAV


 
C'est le même résultat que ma requête :)


[:volta]


---------------
Can't buy what I want because it's free -
Reply

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.  

Reply

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


Message édité par Arjuna le 18-10-2004 à 15:40:14
Reply

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...:o


Message édité par skeye le 18-10-2004 à 15:40:23

---------------
Can't buy what I want because it's free -
Reply

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...:o


J'ai répondu pour les deux, puisque de toute façon Access accèpte les alias pour les deux :p


Message édité par Arjuna le 18-10-2004 à 15:41:20
Reply

Marsh Posté le 18-10-2004 à 15:41:24    

Arjuna a écrit :

J'ai répondu pour les deux :p


ça passe aussi en aliasant les champs? :??:
(j'ai rien pour tester là...flemme de chercher ou est planquée la base de test...[:joce])


Message édité par skeye le 18-10-2004 à 15:41:52

---------------
Can't buy what I want because it's free -
Reply

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


Message édité par Arjuna le 18-10-2004 à 15:42:28
Reply

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...[:ddr555]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-10-2004 à 15:42:26    

L'identifiant est different pour chaque ligne

Reply

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.

Reply

Marsh Posté le 18-10-2004 à 15:43:57    

Avec un alias il ouvre une boite et me demande de saisir une valeur

Reply

Marsh Posté le 18-10-2004 à 15:44:33    

Bon je vais essayer tout ca,
 
merci

Reply

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...


---------------
Can't buy what I want because it's free -
Reply

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.

Reply

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 [:spamafote]
 
Ca me paraît quand même bizarre que tu aies autant de lignes...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed