GROUP BY con MAX (DATE)

Estoy intentando enumerar el último destino (hora de salida MAX) para cada tren en una tabla, por ejemplo :

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 

El resultado deseado debería ser:

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

He intentado usar

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

Obtuve un error "ora-00979 no una expresión GROUP BY" que decía que debía include "Dest" en mi grupo por statement. Pero seguramente eso no es lo que quiero …

¿Es posible hacerlo en una línea de SQL?

No puede include columnas no agregadas en su set de resultados que no estén agrupadas. Si un tren tiene un solo destino, simplemente agregue la columna de destino a su cláusula group by, de lo contrario, debe reconsiderar su consulta.

Tratar:

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

Aquí hay un ejemplo que solo usa una combinación de la izquierda y creo que es más eficiente que cualquier grupo por método: 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; 

Mientras no haya duplicates (y los trenes tienden a llegar solo a una estación a la vez) …

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

Otra solución:

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

Sé que llego tarde a la fiesta, pero intenta esto …

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

Src: Documentación grupal de Concat

Editar: syntax sql fija