GROUP BY с МАКС. (ДАТА) [дубликаты]

На этот вопрос уже есть ответ:

Я пытаюсь перечислить в таблице последнее назначение (МАКС. Время отправления) для каждого поезда, например :

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?

140
задан Pacerier 29 April 2015 в 19:27
поделиться

3 ответа

Нельзя включать в набор результатов неагрегированные столбцы, которые не сгруппированы. Если у поезда только один пункт назначения, просто добавьте столбец пункта назначения в свою группу по предложению, в противном случае вам нужно переосмыслить свой запрос.

Попробуйте:

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
146
ответ дан 4 November 2019 в 09:08
поделиться
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
156
ответ дан 4 November 2019 в 09:08
поделиться

Пока нет дубликатов (а поезда, как правило, прибывают только на одну станцию ​​за раз) ...

select Train, MAX(Time),
      max(Dest) keep (DENSE_RANK LAST ORDER BY Time) max_keep
from TrainTable
GROUP BY Train;
8
ответ дан 4 November 2019 в 09:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: