Récupérer les valeurs associées à un max() dans un group by [MySQL] - SQL/NoSQL - Programmation
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...
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
Marsh Posté le 31-03-2004 à 16:39:39
Code :
|
Et voilà
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?
Marsh Posté le 13-04-2004 à 19:02:25
rufo a écrit : SELECT num_station, max(date_heure) as maxdate, temperature |
Non ça ne marche pas, il renvoie le bon max mais pas du tout le bon élément correspondant
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
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
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 ), expliqué ici :
http://dev.mysql.com/doc/mysql/en/ [...] p-row.html
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?
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?
Marsh Posté le 16-04-2004 à 21:12:30
rufo a écrit : personne ne veut répondre à ma question, svp? |
ou ne peut
Je pense que c'est standard, mais sans en être sur, loin de là
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.
Marsh Posté le 17-04-2004 à 11:14:21
Beegee a écrit : je crois pas que ce soit utilisé en Oracle par exemple. |
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?
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.
Marsh Posté le 17-04-2004 à 23:05:09
Beegee a écrit : exemple : |
ah ok, je vois. Merci.
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