2009-04-27 13 views
0

これは私が以前に質問した質問を参照していて、本当に速い回答者(max count together in an sql query)を持っています。 Problemsetは似ていますが、前の質問の解決策はパフォーマンスの問題を引き起こすループの中でdbにアクセスするように強制します。それでは、いくつかは、参加した後、私は、今持っていることである:uが見ることができるようにSQLクエリで最大カウント2

id | description 
    0 | bla 
    0 | blub 
    0 | bla 
    1 | blablub 
    1 | bla 
    ... | ... 

は、今、idがもう主キーではありません。私が望むのは、結果セット内の各IDに対して最もよく使われる説明を取得することです。これは次のようになります。

id | most_popular_description | times_the_desc_appeared_for_an_id 
    0 |      bla |         2 
    1 |     blablub |         1 
... |      ... |        ... 

答えて

1

最も人気のあるアイテムだけが必要な場合は、これがあなたの探している結果セットを与えるはずです。これを行うには他の方法もありますが、グループ(つまりモード)で「最も一般的な」値を取得する最も簡単な方法はstats_modeです。

SELECT t.id, 
     t.description AS most_popular_description, 
     COUNT(*) AS times_the_desc_appeared_for_an_id 
FROM mytable t INNER JOIN (
    SELECT id, stats_mode(description) AS desc FROM mytable GROUP BY id 
) a ON t.id = a.id AND t.description = a.desc 
GROUP BY t.id, t.description; 

カウントが必要なので、ネストされたクエリ(インラインビュー)が必要であることに注意してください。

+0

のためのおかげで非常にクールな、まだ、私が欲しかったかなり何ではないですが、おかげでたくさん – Red33mer

1

これはすべきことです。

+0

SRYが、それは助け – Red33mer

0

dense_rank()解析関数を使用して、各グループセットの上位Nを得ることができると思います。

このような何か:

select id, description, times_the_desc_appeared_for_an_id 
from 
(
    select id, description, count(description) times_the_desc_appeared_for_an_id 
    dense_rank() over (partition by id, description order by count(description) desc) position 
    from mytable 
    group by id, description 
) 
where 
    position <= 3 
order by id, times_the_desc_appeared_for_an_id; 
+0

haventは、とにかくrwwilden動作しますが、感謝することによって解決するので、それをテスト – Red33mer

関連する問題