2016-04-18 10 views
-1

最大のグループに属する行を選択する方法?SQLで最大のグループから行を選択

は、我々はテーブルを以下したとし、二つのカテゴリ/グループがあります。Fruits(1大きめ)とVegetables

Name  | Category 
-------------------- 
Banana | Fruits 
Orange | Fruits 
Beetroot | Vegetables 

最大のグループから行のみを選択することになるSQLを書くためにどのように?ここで

Banana 
Orange 
+2

がどのDBMSの場合は、あなたが答えをしたいですか? –

+0

postgresデータベースの場合。 –

+0

さて、私の答えの2番目の部分を使ってください。 –

答えて

3

は、Oracleのための答えです:

select * 
from mytable 
where category = (select stats_mode(category) from mytable); 

これはあなたに1つのカテゴリを取得します。だから、ネクタイの場合は、任意に最大数を持つカテゴリの1つを取得します。

そして、ここでは、DBMSはSTATS_MODEをサポートするが、標準SQLウィンドウの機能を搭載しないための答えです:RANK

select name, category 
from 
(
    select name, category, rank() over (order by cnt desc) as rnk 
    from 
    (
    select name, category, count(*) over (partition by category) as cnt 
    from mytable 
) counted 
) ranked 
where rnk = 1; 

あなたが最大カウントを持つすべてのカテゴリを取得します。同調の際にそれらの1つだけが必要な場合は、ORDER BYcategoryを追加してください。 (おかげで修正のためdnoethします。)

+0

'RANK'ではなく' ROW_NUMBER'が動作しませんが、 'ORDER BY'に' category'を追加します。 – dnoeth

+0

@dnoeth:訂正してくれてありがとう。あなたはもちろん正しいのです。 –

0

が、私はそれを考え出した(PostgreSQL用):

with mytable_count as (
    select category, count(category) as category_count 
    from mytable 
    group by category 
    order by category_count desc 
    limit 1 
) 
select mytable.* 
from mytable, mytable_count 
where mytable.category = mytable_count.category 
+0

タイ(2つの異なるカテゴリ、最大カウントが同じ)がある場合、このクエリは1つのカテゴリのアイテムのみを返します。 – jarlh

+0

ねえ、あなたは私の答えを無視していました;-)もちろん、これを解決する他の方法があります。すべてのカテゴリ数を取得する。これらの最大数を取得します。この最大数のすべてのカテゴリを取得します。これらのカテゴリのレコードを取得します。ただし、テーブルに一度だけアクセスすると、ウィンドウ関数を使用する方がよりエレガントで、通常は高速になります。 –

関連する問題