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.