Requête SQL utilisant GROUP BY
et MAX(DATE)
[Question en double]
Question :
Obtenez la dernière destination de chaque train en fonction de son heure de départ maximale à partir du tableau donné. La sortie souhaitée doit exclure les destinations en double tout en conservant l'heure la plus récente.
Exemples de données :
<code>火车 目的地 时间 1 HK 10:00 1 SH 12:00 1 SZ 14:00 2 HK 13:00 2 SH 09:00 2 SZ 07:00</code>
Résultat attendu :
<code>火车 目的地 时间 1 SZ 14:00 2 HK 13:00</code>
Tentative initiale :
Utilisez une simple requête GROUP BY
et MAX(Time)
:
<code class="language-sql">SELECT Train, Dest, MAX(Time) FROM TrainTable GROUP BY Train</code>
Erreur :
Cette requête génère l'erreur "ora-00979 not a GROUP BY expression" indiquant que la colonne Dest
doit également être incluse dans l'instruction GROUP BY
. Cependant, cela entraînera une destination en double pour chaque train.
Solution :
Pour obtenir les résultats souhaités, des requêtes plus complexes peuvent être utilisées :
<code class="language-sql">SELECT train, dest, time FROM ( SELECT train, dest, time, RANK() OVER (PARTITION BY train ORDER BY time DESC) dest_rank FROM traintable ) where dest_rank = 1</code>
Cette requête utilise d'abord la fonction RANK
pour calculer le classement de chaque train pour chaque destination par ordre décroissant d'heure de départ. La clause PARTITION BY train
garantit que le classement est effectué au sein de chaque groupe de train. Enfin, la requête récupère uniquement les enregistrements où dest_rank
est égal à 1, filtrant efficacement les destinations en double et ne conservant que la dernière destination de chaque train.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!