web-dev-qa-db-ja.com

GROUP BYとMAX(DATE)

テーブル内の各列車の最新の目的地(最大出発時間)をリストしようとしています たとえば

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

gROUP BYステートメントに「Dest」を含める必要があることを示す「ora-00979 GROUP BY式ではない」エラーが発生しました。しかし、確かにそれは私が望むものではありません...

1行のSQLで実行できますか?

129
Aries

グループ化されていない非集計列を結果セットに含めることはできません。列車に目的地が1つしかない場合は、目的の列をgroup by句に追加するだけです。そうでない場合は、クエリを再考する必要があります。

試してください:

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
136
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
146
Thilo

左結合のみを使用する例は次のとおりです。既存の方法では、どのグループよりも効率的だと思います。 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;
73
Joe Meyer

別の解決策:

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

重複がない限り(および列車は一度に1つの駅にのみ到着する傾向があります)...

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

私はパーティーに遅れていることを知っていますが、これを試してみてください...

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

Src: グループ連結ドキュメント

編集:SQL構文を修正

4
Gravy