2011-10-09 8 views
9

ここでは、クエリをcountで注文して一番上の行を取得する例を見てきましたが、この場合は複数の「最も頻繁な」値がある可能性があります。私は、ユーザー表の中で最も頻繁に登場する最後の名を見つけたい。この場合 最も頻繁に表示される値を選択する方法は?

は、ここで私がこれまで持っているものです。

select last_name from users group by last_name having max(count(*)); 

残念ながら、このクエリで私は私の最大の機能は、ネストされているエラーを取得します深すぎる。

答えて

23
select 
    x.last_name, 
    x.name_count 
from 
    (select 
    u.last_name, 
    count(*) as name_count, 
    rank() over (order by count(*) desc) as rank 
    from 
    users u 
    group by 
    u.last_name) x 
where 
    x.rank = 1 

分析関数rankを使用します。 count(*) descのオーダーに基づいて番号が割り当てられます。 2つの名前が同じカウントを持つ場合、それらは同じランクを取得し、次の数はスキップされます(したがって、ランク1,1、および3を持つ行が得られる可能性があります)。 dense_rankは、2つの行に同じランクがある場合は次の番号をスキップしません(したがって、1,1,1,2となります)。ただし、ランク1の行だけが必要な場合は、差。

1つの行だけが必要な場合は、各行の番号を変えてください。その場合は、row_numberを使用してください。このような重要な違いは別として、これらの機能は同じで、同じ方法で使用できます。

+0

ありがとう – InkHeart

+0

私はこの答えが不正確であると信じています。高密度ランクはまだ2つの数字を上に戻しますが、次のランク数はスキップしません。 row_numberには両方の数値が一緒に含まれません。 –

+0

@MikeSありがとう!あなたが正しいです、私はそれを書いたときに私がどこにいたのかわかりません。 'rank'と' dense_rank'は、指定されたソートに従って '等しい'場合、複数の行に対して同じ番号を返すことができます。私はテキストを修正しました。 – GolezTrol

5
select name 
from 
    (select name, count(1) 
     from table 
     group by name 
     order by count(1) desc) a 
where rownum = 1 
関連する問題