2

postgresql 9.2 を使用しています。

次のようなデータセットがあります。

ID  A   B
1   x   x  
2   x   x 
2   x   x
2   x   x
3   x   x
4   x   x
4   x   x

上位n件のIDを持つレコードを表示したい。たとえば、ID の上位 2 つのカウント (この場合、ID=2 と 4) とします。したがって、データセットは次のようになります。

ID  A  B
2   x  x
2   x  x   
2   x  x
4   x  x
4   x  x

最初に考えたのは、上位 n カウントを計算して新しいビューを作成し、新しいビューの ID を元のテーブルの ID と照合することでした。これに感謝します
。ただし、EXISTS には膨大な時間がかかるため、クエリは永遠に実行されます。

これを行うためのより良い方法があるのだろうか?

4

2 に答える 2

4

ネストされたウィンドウ関数でこれを行うことができます:

select t.id, t.a, t.b
from (select t.*, dense_rank() over (order by idcnt desc, id) as seqnum
      from (select t.*, count(*) over (partition by id) as idcnt
            from t
           ) t
     ) t
where seqnum <= 2;

SQLFiddleを確認できます。

于 2013-06-07T22:07:49.103 に答える
2

これは、ウィンドウ関数を使用した 2 つのサブクエリ レベルよりもはるかに簡単で高速です。

SELECT *
FROM   t
JOIN  (
   SELECT id
   FROM   t
   GROUP  BY 1
   ORDER  BY count(*) DESC
   LIMIT  2
   ) top2 USING (id)

前に述べたように、これを本当に高速にするにはインデックスが必要です。が主キーの場合idは、すべて設定されています。

于 2013-06-07T23:47:09.680 に答える