На этот вопрос уже есть ответ:
Я пытаюсь перечислить в таблице последнее назначение (МАКС. Время отправления) для каждого поезда, например :
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
желаемый результат должен быть:
Train Dest Time
1 SZ 14:00
2 HK 13:00
Я пытался использовать
SELECT Train, Dest, MAX(Time)
FROM TrainTable
GROUP BY Train
, когда я получил ошибку «ora-00979 not GROUP BY expression», говорящую, что я должен включить 'Dest' в моей группе по заявлению. Но, конечно, это не то, что я хочу ...
Возможно ли сделать это в одной строке SQL?
Нельзя включать в набор результатов неагрегированные столбцы, которые не сгруппированы. Если у поезда только один пункт назначения, просто добавьте столбец пункта назначения в свою группу по предложению, в противном случае вам нужно переосмыслить свой запрос.
Попробуйте:
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
Пока нет дубликатов (а поезда, как правило, прибывают только на одну станцию за раз) ...
select Train, MAX(Time),
max(Dest) keep (DENSE_RANK LAST ORDER BY Time) max_keep
from TrainTable
GROUP BY Train;