2016-11-27 4 views
0

フィールドA、B、C、D、Eを含むテーブルABCから選択したいとします.Eは数値フィールドです。GROUP BY返されたフィールドの小さなサブセット

ABの組み合わせに対して、最大値がEの行を戻したいとします。これはどうすればいいですか?何をすればいいですかGROUP BY

私は、Eの周りにmaxを置いてA、BでGROUPしようとすると "not a GROUP BY expression"というエラーが出ますが、A、BだけでGROUPしたいです。

私は

select A,B,C,D,max(E) 
from ABC 
group by A,B 

を試してみましたが、これは動作しません。

答えて

1

これは、group byを必要としません。典型的な方法は次のとおりです。

select abc.* 
from abc 
where abc.e = (select max(abc2.e) from abc abc2 where abc.a = abc2.a and abc.b = abc2.a); 

複数の行が同じ最大e値を持っている場合しかし、これは重複を返します。別の方法は、ANSI標準の窓関数を使用する:重複最大e値が存在する場合

select abc.* 
from (select abc.*, 
      row_number() over (partition by a, b order by e desc) as seqnum 
     from abc 
    ) abc 
where seqnum = 1; 

これは、一方(任意)行を返します。このメソッドを使用して複製を作成する場合は、row_number()の代わりにrank()またはdense_rank()を使用できます。

+0

どちらが優れていますか? row_number()列を含む中間テーブルを削除し、元のクエリのABCのWHERE句だけを使用して、AとBの各組み合わせに対して必要な行を取得する方法はありますか?言い換えれば、PARTITIONとWHERE節に必要な行を取り込むことを統合できますか? – user2371765

+0

私はこれが好きなのが望ましいです。 (ABC.A 、ABC.B )の順にABC.E)= 1 rank()以上でパーティションを選択してください。この場合、「ここではウィンドウ関数は許可されていません」というエラーが表示されます。 – user2371765

1
select t1.* 
from ABC t1 
join 
(
    select A,B,max(E) as maxE 
    from ABC 
    group by A,B 
) t2 on t1.a = t2.a and t1.b = t2.b and t1.e = t2.maxE 
+0

これは機能しますが、結合やネストされたクエリを回避する方法はありますか? PARTITIONは1つの方法です。 – user2371765

関連する問題