SQL-Abfrage mit GROUP BY
und MAX(DATE)
[Doppelte Frage]
Frage:
Ermitteln Sie das späteste Ziel jedes Zugs basierend auf seiner maximalen Abfahrtszeit aus der angegebenen Tabelle. Die gewünschte Ausgabe sollte doppelte Ziele ausschließen und gleichzeitig die neueste Zeit beibehalten.
Beispieldaten:
<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>
Erwartetes Ergebnis:
<code>火车 目的地 时间 1 SZ 14:00 2 HK 13:00</code>
Erster Versuch:
Verwenden Sie eine einfache GROUP BY
-Abfrage und MAX(Time)
:
<code class="language-sql">SELECT Train, Dest, MAX(Time) FROM TrainTable GROUP BY Train</code>
Fehler:
Diese Abfrage führt zu dem Fehler „ora-00979 not a GROUP BY expression“, was darauf hinweist, dass die Spalte Dest
auch in der GROUP BY
-Anweisung enthalten sein muss. Dies führt jedoch zu einem doppelten Ziel für jeden Zug.
Lösung:
Um die gewünschten Ergebnisse zu erzielen, können komplexere Abfragen verwendet werden:
<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>
Diese Abfrage verwendet zunächst die Funktion RANK
, um die Rangfolge jedes Zuges für jedes Ziel in absteigender Reihenfolge der Abfahrtszeit zu berechnen. Die PARTITION BY train
-Klausel stellt sicher, dass innerhalb jeder Zuggruppe eine Rangfolge durchgeführt wird. Schließlich ruft die Abfrage nur Datensätze ab, bei denen dest_rank
gleich 1 ist, wodurch doppelte Ziele effektiv herausgefiltert werden und nur das letzte Ziel für jeden Zug beibehalten wird.
Das obige ist der detaillierte Inhalt vonWie erhalte ich mit SQLs „GROUP BY' und „MAX(DATE)' das neueste Ziel für jeden Zug?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!