wake-up-neo.net

GROUP BY mit MAX (DATE)

Ich versuche, das letzte Ziel (MAX Abfahrtzeit) für jeden Zug in einer Tabelle aufzulisten, zum Beispiel :

Train    Dest      Time
1        HK        10:00
1        SH        12:00
1        SZ        14:00
2        HK        13:00
2        SH        09:00
2        SZ        07:00

Das gewünschte Ergebnis sollte sein:

Train    Dest      Time
1        SZ        14:00
2        HK        13:00

Ich habe versucht mit

SELECT Train, Dest, MAX(Time)
FROM TrainTable
GROUP BY Train

by Ich habe den Fehler "ora-00979, kein GROUP BY-Ausdruck" erhalten, der besagt, dass ich 'Dest' in meine group by-Anweisung aufnehmen muss. Aber das will ich doch nicht ...

Ist es möglich, dies in einer SQL-Zeile zu tun?

135
Aries

Sie können keine nicht aggregierten Spalten in Ihre Ergebnismenge aufnehmen, die nicht gruppiert sind. Wenn ein Zug nur ein Ziel hat, fügen Sie einfach die Zielspalte Ihrer Gruppe nach Klausel hinzu, andernfalls müssen Sie Ihre Abfrage überdenken.

Versuchen:

SELECT t.Train, t.Dest, r.MaxTime
FROM (
      SELECT Train, MAX(Time) as MaxTime
      FROM TrainTable
      GROUP BY Train
) r
INNER JOIN TrainTable t
ON t.Train = r.Train AND t.Time = r.MaxTime
144
Oliver Hanappi
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
151
Thilo

Hier ist ein Beispiel, das nur einen Left-Join verwendet und meiner Meinung nach effizienter ist als jede andere Methode nach Gruppen: ExchangeCore-Blog

SELECT t1.*
FROM TrainTable t1 LEFT JOIN TrainTable t2
ON (t1.Train = t2.Train AND t1.Time < t2.Time)
WHERE t2.Time IS NULL;
75
Joe Meyer

Eine andere Lösung:

select * from traintable
where (train, time) in (select train, max(time) from traintable group by train);
12
Claudio Negri

Solange es keine Duplikate gibt (und Züge immer nur an einer Station ankommen) ...

select Train, MAX(Time),
      max(Dest) keep (DENSE_RANK LAST ORDER BY Time) max_keep
from TrainTable
GROUP BY Train;
8
Gary Myers

Ich weiß, dass ich zu spät zur Party komme, aber versuche das ...

SELECT 
    `Train`, 
    `Dest`,
    SUBSTRING_INDEX(GROUP_CONCAT(`Time` ORDER BY `Time` DESC), ",", 1) AS `Time`
FROM TrainTable
GROUP BY Train;

Src: Group Concat Documentation

Bearbeiten: Feste SQL-Syntax

4
Gravy