190

各列車の最新の目的地(最大出発時刻)を表にリストしようとしています。

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

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

SQLの1行でそれを行うことは可能ですか?

4

6 に答える 6

203
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
于 2010-08-16T07:42:11.010 に答える
187

グループ化されていない結果セットには、集計されていない列を含めることはできません。列車の目的地が 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
于 2010-08-16T07:44:10.970 に答える
92

以下は、Left Join のみを使用する例です。私は、どのグループ バイ メソッドよりも効率的であると考えています。ExchangeCore ブログ

SELECT t1.*
FROM TrainTable t1 LEFT JOIN TrainTable t2
ON (t1.Train = t2.Train AND t1.Time < t2.Time)
WHERE t2.Time IS NULL;
于 2013-02-12T20:16:19.220 に答える
16

別の解決策:

select * from traintable
where (train, time) in (select train, max(time) from traintable group by train);
于 2014-06-23T16:07:31.617 に答える
9

重複がない限り (そして、列車は一度に 1 つの駅にしか到着しない傾向があります)...

select Train, MAX(Time),
      max(Dest) keep (DENSE_RANK LAST ORDER BY Time) max_keep
from TrainTable
GROUP BY Train;
于 2010-08-16T23:24:39.677 に答える