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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Récupérer les valeurs associées à un max() dans un group by

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Récupérer les valeurs associées à un max() dans un group by

n°687345
Agatha
Posté le 30-03-2004 à 14:19:03  profilanswer
 

Bonjour,
 
Après avoir cherché un moment en vain, je m'en remet à vous pour peut-être tenter de trouver une solution !
J'ai une table de relevés météo (meteo_releves) ayant pour clé primaire les champs num_station (identifiant une station météo) et date_heure (date et heure du relevé, il y en a toutes les heures à toutes les trois heures).
cette table contient ensuite toutes les valeurs relevées (temperature, humidite, pression, etc...)
Faisons simple, je désirerai récupérer les derniers relevés de température pour chaque station, ainsi imaginons que la table contienne ceci:
   num_station   |    date_heure     |    temperature
      00001       | 2004-03-30 10:00 |        17.6
      00001       | 2004-03-30 11:00 |        18.2
      00001       | 2004-03-30 12:00 |        19.1
      00002       | 2004-03-30 10:00 |        16.2
      00002       | 2004-03-30 11:00 |        16.9
      00003       | 2004-03-29 23:00 |         5.3
      00003       | 2004-03-30 08:00 |         9.6
      00003       | 2004-03-30 10:00 |        12.5
 
La requete devrait me retourner:
 
      00001       | 2004-03-30 12:00 |        19.1
      00002       | 2004-03-30 11:00 |        16.9
      00003       | 2004-03-30 10:00 |        12.5
 
J'ai un peu tout essayé, j'arrive à récupérer les max(date_heure) pour chaque station avec un group by du style:
 
SELECT num_station, max(date_heure), temperature
FROM meteo_releves
GROUP BY num_station
 
...mais les températures associées ne sont pas celles dont date_heure = max(date_heure) pour chaque groupe (mais les premieres rencontrées dans la table pour chaque groupe)
 
Si vous avez une idée... un grand merci d'avance !


Message édité par Agatha le 30-03-2004 à 14:33:18
mood
Publicité
Posté le 30-03-2004 à 14:19:03  profilanswer
 

n°687409
dlaumor
Posté le 30-03-2004 à 14:54:34  profilanswer
 

il faut que tu fasses des requetes imbriquées genre
 
select a.num_station, a.date_heure, a.température
from meteo_releves a,  
(select b.num_station, max(b.date_heure from meteo_releves b group by b.num_station) c
where a.num_station = c.num_station and a.date_heure = c.date_heure
 
Je ne sais pas si ca fonctionne en MySQL tu peux aussi faire une vue de la sous requete et ensuite la traiter comme une table...

n°687418
Agatha
Posté le 30-03-2004 à 15:02:51  profilanswer
 

Ah oui zut, j'oubliais de préciser, sous Oracle pas de souci pour faire cette requete avec les imbrications, mais en l'occurence je suis obligé de la faire sous MySQL qui ne les supporte pas, ni les vues à priori :/

n°688648
ratibus
Posté le 31-03-2004 à 16:39:39  profilanswer
 

Code :
  1. CREATE TEMPORARY TABLE maximums SELECT b.num_station, MAX(b.date_heure) FROM meteo_releves b GROUP BY b.num_station;
  2. SELECT a.num_station, a.date_heure, a.température
  3. FROM meteo_releves a JOIN maximums c ON a.num_station = c.num_station AND a.date_heure = c.date_heure;
  4. DROP TEMPORARY TABLE maximums;


 
Et voilà :)


Message édité par ratibus le 31-03-2004 à 16:39:58
n°698346
rufo
Pas me confondre avec Lycos!
Posté le 13-04-2004 à 15:26:25  profilanswer
 

SELECT num_station, max(date_heure) as maxdate, temperature  
FROM meteo_releves  
GROUP BY num_station, maxdate
 
ça marche ça?

n°698542
ratibus
Posté le 13-04-2004 à 19:02:25  profilanswer
 

rufo a écrit :

SELECT num_station, max(date_heure) as maxdate, temperature  
FROM meteo_releves  
GROUP BY num_station, maxdate
 
ça marche ça?  


Non ça ne marche pas, il renvoie le bon max mais pas du tout le bon élément correspondant

n°698819
rufo
Pas me confondre avec Lycos!
Posté le 14-04-2004 à 08:19:08  profilanswer
 

En tout cas, la réponse à ce pb m'intéresse car je l'ai rencontré, et pas encore résolu :(

n°698874
mrbebert
Posté le 14-04-2004 à 09:47:48  profilanswer
 

C'est un problème "classique" mainte fois abordé par des générations de développeurs désespérés :D [:proy]  
La solution de la table temporaire est certainement la plus propre :)  
 
Mais il existe aussi le "MAX-CONCAT trick" (nommé ainsi dans la doc mysql :D ), expliqué ici :
http://dev.mysql.com/doc/mysql/en/ [...] p-row.html


Message édité par mrbebert le 14-04-2004 à 09:49:36
n°699152
rufo
Pas me confondre avec Lycos!
Posté le 14-04-2004 à 14:09:09  profilanswer
 

Question : j'utilise la couche d'abstraction DB de PEAR pour être "relativement" indépendant du sgbd. Est-ce-que le INNER JOIN...On, le LEFT JOIN...ON sont des instructions standards du SQL ou sont-elles propres à MySql?

n°700064
rufo
Pas me confondre avec Lycos!
Posté le 15-04-2004 à 13:08:18  profilanswer
 

up :)

mood
Publicité
Posté le 15-04-2004 à 13:08:18  profilanswer
 

n°701183
rufo
Pas me confondre avec Lycos!
Posté le 16-04-2004 à 15:49:52  profilanswer
 

rufo a écrit :

Question : j'utilise la couche d'abstraction DB de PEAR pour être "relativement" indépendant du sgbd. Est-ce-que le INNER JOIN...On, le LEFT JOIN...ON sont des instructions standards du SQL ou sont-elles propres à MySql?


 
personne ne veut répondre à ma question, svp? :hello:

n°701457
mrbebert
Posté le 16-04-2004 à 21:12:30  profilanswer
 

rufo a écrit :

personne ne veut répondre à ma question, svp? :hello:

ou ne peut [:proy]  
Je pense que c'est standard, mais sans en être sur, loin de là :/

n°701545
Beegee
Posté le 17-04-2004 à 07:50:49  profilanswer
 

je crois pas que ce soit utilisé en Oracle par exemple.
En Oracle, on écrit directement des choses comme :
 
SELECT *
FROM TABLE1, TABLE2
WHERE TABLE1.KEY = TABLE2.KEY
 
pour une jointure interne, et :
 
SELECT *
FROM TABLE1, TABLE2
WHERE TABLE1.KEY = TABLE2.KEY(+)
 
pour une jointure externe.

n°701584
rufo
Pas me confondre avec Lycos!
Posté le 17-04-2004 à 11:14:21  profilanswer
 

Beegee a écrit :

je crois pas que ce soit utilisé en Oracle par exemple.
En Oracle, on écrit directement des choses comme :
 
SELECT *
FROM TABLE1, TABLE2
WHERE TABLE1.KEY = TABLE2.KEY
 
pour une jointure interne, et :
 
SELECT *
FROM TABLE1, TABLE2
WHERE TABLE1.KEY = TABLE2.KEY(+)
 
pour une jointure externe.


 
Je connais la jointure "interne" (moi, je la connaissais sous la dénomination "équi-jointure" ), mais pas la jointure externe. Ca donne quoi comme différences au niveau du résultat?

n°701589
Beegee
Posté le 17-04-2004 à 11:22:33  profilanswer
 

exemple :
 
TABLE1
KEY    FIELD
1      TEST1
2      TEST2
 
TABLE2
KEY    FIELD
1      TEST3
 
Si tu fais :
 
SELECT TABLE1.KEY, TABLE1.FIELD F1, TABLE2.FIELD F2
FROM TABLE1, TABLE2  
WHERE TABLE1.KEY = TABLE2.KEY(+)
 
le résultat doit être :
 
KEY    F1    F2
1      TEST1 TEST3
2      TEST2 <NULL>
 
En gros, ça revoit une ligne de résultat même si la jointure n'est pas faite (par KEY ici), et dans ce cas, les champs récupérés de TABLE2 sont NULL.

n°701927
rufo
Pas me confondre avec Lycos!
Posté le 17-04-2004 à 23:05:09  profilanswer
 

Beegee a écrit :

exemple :
 
TABLE1
KEY    FIELD
1      TEST1
2      TEST2
 
TABLE2
KEY    FIELD
1      TEST3
 
Si tu fais :
 
SELECT TABLE1.KEY, TABLE1.FIELD F1, TABLE2.FIELD F2
FROM TABLE1, TABLE2  
WHERE TABLE1.KEY = TABLE2.KEY(+)
 
le résultat doit être :
 
KEY    F1    F2
1      TEST1 TEST3
2      TEST2 <NULL>
 
En gros, ça revoit une ligne de résultat même si la jointure n'est pas faite (par KEY ici), et dans ce cas, les champs récupérés de TABLE2 sont NULL.


 
ah ok, je vois. Merci.

n°701959
mrbebert
Posté le 18-04-2004 à 00:12:06  profilanswer
 

C'est le "LEFT JOIN" de mysql :)


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

  [MySQL] Récupérer les valeurs associées à un max() dans un group by

 

Sujets relatifs
recuperer colonne et ligne d'une adresseRecupérer le handle d'une fenetre
Connexion qui délire entre mon appli Java et MySql[js] recupérer une varible
connection tomcat/mysqlExemple de code pour recuperer les donnes d un formulaire
comment recuperer un texte écrit dans un JComboBox[Requête] [MySQL] [Update] je trouve po :o
Pour les champions de ANT/XDOCLET pour EJB et MySQL / JONASPOST DE NB, php/mysql trouvez vous l'erreur dans le compteur? (resolu)
Plus de sujets relatifs à : [MySQL] Récupérer les valeurs associées à un max() dans un group by


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