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

Récupérer les valeurs associées à un max() dans un group by [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 30-03-2004 à 14:19:03    

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
Reply

Marsh Posté le 30-03-2004 à 14:19:03   

Reply

Marsh Posté le 30-03-2004 à 14:54:34    

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

Reply

Marsh Posté le 30-03-2004 à 15:02:51    

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

Reply

Marsh Posté le 31-03-2004 à 16:39:39    

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
Reply

Marsh Posté le 13-04-2004 à 15:26:25    

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

Reply

Marsh Posté le 13-04-2004 à 19:02:25    

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

Reply

Marsh Posté le 14-04-2004 à 08:19:08    

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

Reply

Marsh Posté le 14-04-2004 à 09:47:48    

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
Reply

Marsh Posté le 14-04-2004 à 14:09:09    

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?

Reply

Marsh Posté le 15-04-2004 à 13:08:18    

up :)

Reply

Marsh Posté le 15-04-2004 à 13:08:18   

Reply

Marsh Posté le 16-04-2004 à 15:49:52    

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:

Reply

Marsh Posté le 16-04-2004 à 21:12:30    

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à :/

Reply

Marsh Posté le 17-04-2004 à 07:50:49    

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.

Reply

Marsh Posté le 17-04-2004 à 11:14:21    

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?

Reply

Marsh Posté le 17-04-2004 à 11:22:33    

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.

Reply

Marsh Posté le 17-04-2004 à 23:05:09    

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.

Reply

Marsh Posté le 18-04-2004 à 00:12:06    

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

Reply

Sujets relatifs:

Leave a Replay

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