SQL列で最も頻繁な値を見つける


122

SQLテーブルの特定の列で最も頻度の高い値を見つけるにはどうすればよいですか?

たとえば、このテーブルtwoでは、最も頻繁に使用される値であるため、次のように返されます。

one
two
two
three


1
ネクタイはどうですか?サンプルデータに別の「3」行を追加し、期待される結果を指定します。
jarlh

回答:


180
SELECT       `column`,
             COUNT(`column`) AS `value_occurrence` 
    FROM     `my_table`
    GROUP BY `column`
    ORDER BY `value_occurrence` DESC
    LIMIT    1;

とを交換columnしてくださいmy_table。列の最も一般的な値1を表示する場合は増やしNます。


1
'my_table'から別のフィールドも選択したい場合はどうすればよいですか?つまり、別の値です。
grep

7
複数の値が何度も同じように表示される場合(最大)この場合、3回も2回登場したら?LIMIT 1は1つのレコードのみを表示します
mustafa1993 '17年

1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed

追加すると機能しないのはなぜWHERE 'value_occurrence' = 1ですか?
スイス、

1
この場合HAVINGWHERE、代わりに@swisswissを使用する必要があります。
HellBaby

47

次のようなものを試してください:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;

6
COUNT(*)直接使用できることを知りませんでしたORDER BYGROUP BY/ HAVINGと集計列に関していくつかの制限があることを知っていて、それが機能しないと常に想定していました。
Mihai Stancu 2012

21

テーブル名をtblperson、列名をと考えてみましょうcity。都市の列から最も多く繰り返される都市を取得したい:

 select city,count(*) as nor from tblperson
        group by city
          having count(*) =(select max(nor) from 
            (select city,count(*) as nor from tblperson group by city) tblperson)

これnorがエイリアス名です。


任意のデータベースで機能する標準SQLを使用する場合の+1(LIMITはMySQL固有、TOPはSQL Server固有です)。
ディランスミス

7

以下のクエリは、SQL Serverデータベースでうまく機能するようです。

select column, COUNT(column) AS MOST_FREQUENT
from TABLE_NAME
GROUP BY column
ORDER BY COUNT(column) DESC

結果:

column          MOST_FREQUENT
item1           highest count
item2           second highest 
item3           third higest
..
..

3

SQL Serverで使用します。

その中で制限コマンドのサポートはないので。

この場合、トップ1コマンドを使用して、特定の列で発生する最大値を見つけることができます(値)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;

また、COUNT関数をORDER BYセクションに移動して、次のエラーを回避する必要があります
。EXISTS

1

テーブルが ' SalesLT.Customer'であり、計算しようとしている列が ' CompanyName'でAggCompanyNameあり、エイリアスであると想定しています。

Select CompanyName, Count(CompanyName) as AggCompanyName from SalesLT.Customer
group by CompanyName
Order By Count(CompanyName) Desc;

0

LIMITを使用できない場合、またはLIMITはクエリツールのオプションではありません。代わりに「ROWNUM」を使用できますが、サブクエリが必要になります。

SELECT FIELD_1, ALIAS1
FROM(SELECT FIELD_1, COUNT(FIELD_1) ALIAS1
    FROM TABLENAME
    GROUP BY FIELD_1
    ORDER BY COUNT(FIELD_1) DESC)
WHERE ROWNUM = 1

MySQLにはないROWNUM
Barmar

これはoracleでは有効ですが、mysqlでは無効です
Prabhu

1
MySQLでは@Prabhu、LIMIT 1代わりに使用します。構文は受け入れられた回答に示されています。
ToolmakerSteve 2017年

0

ID列があり、IDごとに別の列から最も反復的なカテゴリを見つけたい場合は、以下のクエリを使用できます。

テーブル:

テーブルの内容

クエリ:

SELECT ID, CATEGORY, COUNT(*) AS FREQ
FROM TABLE
GROUP BY 1,2
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY FREQ DESC) = 1;

結果:

クエリ結果


-1

私が使用する1つの方法は次のとおりです。

選択する 、カウント()Table_NameのVAR1として

グループ化

VAR1の説明による順序

制限1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.