sql - update_option - GROUP BY con MAX(DATE)
page_for_posts wordpress (6)
Esta pregunta ya tiene una respuesta aquí:
- Obtener la fila que tiene el valor Máx. Para una columna 33 respuestas
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 incluir "Dest" en mi grupo por declaración. Pero seguramente eso no es lo que quiero ...
¿Es posible hacerlo en una línea de SQL?
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 duplicados (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;
No puede incluir columnas no agregadas en su conjunto 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
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: sintaxis sql fija
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