Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1881 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Fonction MAX

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Fonction MAX

n°876014
nam2
Posté le 18-10-2004 à 15:05:43  profilanswer
 

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

mood
Publicité
Posté le 18-10-2004 à 15:05:43  profilanswer
 

n°876018
skeye
Posté le 18-10-2004 à 15:11:25  profilanswer
 

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


---------------
Can't buy what I want because it's free -
n°876019
mareek
Et de 3 \o/
Posté le 18-10-2004 à 15:11:30  profilanswer
 

ç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
n°876021
skeye
Posté le 18-10-2004 à 15:13:05  profilanswer
 

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 -
n°876028
nam2
Posté le 18-10-2004 à 15:15:50  profilanswer
 

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.

n°876029
mareek
Et de 3 \o/
Posté le 18-10-2004 à 15:16:34  profilanswer
 

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
n°876030
skeye
Posté le 18-10-2004 à 15:18:24  profilanswer
 

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 -
n°876035
skeye
Posté le 18-10-2004 à 15:21:22  profilanswer
 

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 -
n°876036
nam2
Posté le 18-10-2004 à 15:22:19  profilanswer
 

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
n°876038
skeye
Posté le 18-10-2004 à 15:26:44  profilanswer
 

: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 -
mood
Publicité
Posté le 18-10-2004 à 15:26:44  profilanswer
 

n°876051
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:33:52  profilanswer
 

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
n°876053
KangOl
Profil : pointeur
Posté le 18-10-2004 à 15:35:32  profilanswer
 

un distinct alors...


---------------
Nos estans firs di nosse pitite patreye...
n°876057
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:36:51  profilanswer
 

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

n°876058
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:37:29  profilanswer
 

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
n°876059
KangOl
Profil : pointeur
Posté le 18-10-2004 à 15:38:11  profilanswer
 

distinct sur le nom... :o


---------------
Nos estans firs di nosse pitite patreye...
n°876060
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:38:31  profilanswer
 

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
n°876061
skeye
Posté le 18-10-2004 à 15:38:40  profilanswer
 

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 -
n°876064
nam2
Posté le 18-10-2004 à 15:39:31  profilanswer
 

'nom n' ou bien 'valeur v', le fait de renommer une colonne n'est pas accepte pas access.  

n°876065
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:39:45  profilanswer
 

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
n°876066
skeye
Posté le 18-10-2004 à 15:40:08  profilanswer
 

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 -
n°876067
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:40:30  profilanswer
 

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
n°876069
skeye
Posté le 18-10-2004 à 15:41:24  profilanswer
 

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 -
n°876071
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:41:52  profilanswer
 

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
n°876072
skeye
Posté le 18-10-2004 à 15:42:21  profilanswer
 

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 -
n°876073
nam2
Posté le 18-10-2004 à 15:42:26  profilanswer
 

L'identifiant est different pour chaque ligne

n°876074
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 15:42:51  profilanswer
 

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.

n°876075
nam2
Posté le 18-10-2004 à 15:43:57  profilanswer
 

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

n°876078
nam2
Posté le 18-10-2004 à 15:44:33  profilanswer
 

Bon je vais essayer tout ca,
 
merci

n°876079
skeye
Posté le 18-10-2004 à 15:44:58  profilanswer
 

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 -
n°876176
nam2
Posté le 18-10-2004 à 16:37:35  profilanswer
 

Un petit conseil n'essayait pas sur un pc de 64Mo de RAM, apres 1H vous n'aurez toujours pas de reponse.

n°876182
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-10-2004 à 16:43:58  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Fonction MAX

 

Sujets relatifs
[PHP] Requête sql avec une variable[Swish Max] Cherche bon player MP3 ... sous SWISH!
Faire listing des logiciels les plus dl a partir de base SQL[SQL server] Probleme de fonction de chaine (parsing)
Tcl-Tk: fonction traceErreur SQL
redirection selon une fonction[ASM][TIME] quelle est la fonction pour récupérer l'heure/min/sec ?
Clés primaire et index (SQL Server 2000)[ASP et SQL] Probléme pour récupérer la valeur de la fonction sql MAX
Plus de sujets relatifs à : [SQL] Fonction MAX


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR