Suchen Sie den häufigsten Wert in der SQL-Spalte


122

Wie finde ich den häufigsten Wert in einer bestimmten Spalte in einer SQL-Tabelle?

Für diese Tabelle sollte twosie beispielsweise zurückgegeben werden, da dies der häufigste Wert ist:

one
two
two
three


1
Was ist mit Krawatten? Fügen Sie den Beispieldaten eine weitere Zeile "Drei" hinzu und geben Sie das erwartete Ergebnis an.
Jarlh

Antworten:


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

Ersetzen columnund my_table. Erhöhen 1Sie, wenn Sie die Nhäufigsten Werte der Spalte anzeigen möchten .


1
Was soll ich tun, wenn ich auch andere Felder aus 'my_table' auswählen möchte? Mit anderen Worten, ein anderer Wert;
Grep

7
Was ist, wenn mehr als ein Wert nicht immer gleich erscheint (was maximal ist)? In diesem Fall, wenn drei auch zweimal erschienen? LIMIT 1 zeigt nur einen Datensatz
mustafa1993

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

Warum funktioniert es nicht, wenn ich hinzufüge WHERE 'value_occurrence' = 1?
Schweizer

1
@swisswiss müssen Sie HAVINGanstelle von WHEREin diesem Fall verwenden.
HellBaby

47

Versuchen Sie etwas wie:

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

6
Ich wusste nicht, dass man COUNT(*)direkt in der verwenden kann ORDER BY. Ich wusste, dass es einige Einschränkungen in Bezug auf GROUP BY/ HAVINGund aggregierte Spalten gibt, und ich ging immer davon aus, dass dies nicht funktionieren würde.
Mihai Stancu

21

Betrachten wir den Tabellennamen als tblpersonund den Spaltennamen als city. Ich möchte die am häufigsten wiederholte Stadt aus der Stadtspalte abrufen:

 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)

Hier norist ein Aliasname.


+1 für die Verwendung von Standard-SQL, das in jeder Datenbank funktioniert (während LIMIT MySQL-spezifisch ist, ist TOP SQL Server-spezifisch).
Dylan Smith

7

Die folgende Abfrage scheint für mich in der SQL Server-Datenbank gut zu funktionieren:

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

Ergebnis:

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

3

Zur Verwendung mit SQL Server.

Da es darin keine Unterstützung für Limit-Befehle gibt.

In diesem Fall können Sie den Befehl top 1 verwenden, um den maximal vorkommenden Wert in der jeweiligen Spalte zu ermitteln (Wert).

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

Sie müssen auch die COUNT-Funktion in den Abschnitt ORDER BY verschieben, um den folgenden Fehler zu vermeiden: Es kann nur ein Ausdruck in der Auswahlliste angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeführt wird
Saba Jamalian

1

Angenommen, Tabelle ist ' SalesLT.Customer' und die Spalte, die Sie herausfinden möchten, ist ' CompanyName' und AggCompanyNameist ein Alias.

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

0

Wenn Sie LIMIT nicht verwenden können oder LIMIT keine Option für Ihr Abfragetool ist. Sie können stattdessen "ROWNUM" verwenden, benötigen jedoch eine Unterabfrage:

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 hat nichtROWNUM
Barmar

Dies gilt für Orakel, aber nicht für MySQL
Prabhu

1
@Prabhu in MySQL verwenden Sie LIMIT 1stattdessen; Die Syntax wird in der akzeptierten Antwort angezeigt.
ToolmakerSteve

0

Wenn Sie eine ID-Spalte haben und für jede ID die sich am meisten wiederholende Kategorie aus einer anderen Spalte suchen möchten, können Sie die folgende Abfrage verwenden:

Tabelle:

Tabelleninhalt

Abfrage:

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

Ergebnis:

Abfrageergebnis


-1

Eine Möglichkeit, die ich gerne benutze, ist:

wählen ,ANZAHL() als VAR1 aus Table_Name

gruppiere nach

Bestellung per VAR1 absteigend

Limit 1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.