2012-05-01 2 views
1

oracleクエリー内のいくつかのグループに対してN回の結果を得る方法を教えてください。条件が追加された異なるグループのN個の結果を返します。oracle sql

は、例えば以下の表を参照してください。

ID Team Auditor 
    1 Tm1  Jill 
    2 Tm2  Jill 
    3 Tm1  Jill 
    4 Tm2  Jack 
    5 Tm2  Jack 
    6 Tm2  Jack 
    7 Tm3  Sam 
    8 Tm1  Sam 
    9 Tm5  Sam 

より監査人とチームを持つ複数の行があります。可能であれば、3つの異なるチームを持つ各監査人に対して3つのチームを獲得したいと考えています。

私はすでに、監査人ごとに3つのチームを返すために次のSQLを使用していますが、実際には理想的ではない同じチームの3つを取得することがあります(ジャック参照)。

select * 
    from (select ID, 
       Team, 
       Auditor, 
       rank() over (partition by Auditor order by ID) rank 
      from table) 
where rank <= 3; 
+0

出力は何ですか? –

答えて

1

あなたのテストデータは、説明したケースをカバーしていません。

あなたはこれを行うことができます:あなたは2種類を持っているので、

select * 
from(
    select ID, 
      Team, 
      Auditor, 
      row_number() over (partition by Auditor order by rank1) as rank 
     from (select ID, 
        Team, 
        Auditor, 
        row_number() over (partition by Auditor, team order by id) rank1 
       from table) 
    ) 
where rank <= 3; 

は、しかし、これは、より高価になるだろう。

内クエリは2秒と監査チームの第1の組み合わせとランク、等

中間クエリは内側ランク後監査行をランク付けするので、監査人は、最初の行に別のものをランク付けしているであろうチーム。

外部クエリは、すべての監査者の最初の3つの行を取得します。

+0

こんにちは、これは私が欲しかったものを正確に返しています。ソリューションとそれがどのように動作するかの説明の両方に多くの感謝! – bawpie

+0

あなたは大歓迎です! –

+0

クエリでrank1を公開してフィルタする必要はありませんか? 'where rank1 <= 3' http://www.sqlfiddle.com/#!4/2ec8d/8そうでなければ、私はこのクエリがOP http://www.sqlfiddle.comの元のクエリとは違って見えません/#!4/2ec8d/14あなたの答えは受け入れられます。その結果、今OPで使用されています。 OPの最後には、代わりにrank1をフィルタとして使用しますか? Whatdyaはどう思う? :-) –

関連する問題