Znajdź najczęstszą wartość w kolumnie SQL

122

Jak znaleźć najczęstszą wartość w danej kolumnie w tabeli SQL?

Na przykład dla tej tabeli powinna zostać zwrócona, twoponieważ jest to najczęstsza wartość:

one
two
two
three
Jake
źródło
1
Wersja GROUP BY: stackoverflow.com/questions/344665/get-most-common-value-in-sql
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
A co z krawatami? Dodaj kolejny wiersz „trzy” do przykładowych danych i określ oczekiwany wynik.
jarlh

Odpowiedzi:

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

Wymień columni my_table. Zwiększ, 1jeśli chcesz zobaczyć Nnajczęściej używane wartości w kolumnie.

Mihai Stancu
źródło
1
co powinienem zrobić, jeśli chcę również wybrać inne pola z „my_table”? Innymi słowy, inna wartość;
grep
7
co się stanie, jeśli więcej niż jedna wartość pojawi się tyle samo razy (co jest wartością maksymalną)? W takim razie, jeśli trzy pojawiły się również dwukrotnie? LIMIT 1 pokaże tylko jeden rekord
mustafa1993
1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed
dlaczego to nie działa po dodaniu WHERE 'value_occurrence' = 1?
szwajcarski
1
@swisswiss musisz użyć HAVINGzamiast WHEREw tym przypadku.
HellBaby,
47

Spróbuj czegoś takiego:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;
Mata
źródło
6
Nie wiedziałem, że możesz użyć COUNT(*)bezpośrednio w ORDER BY. Wiedziałem, że jest kilka ograniczeń dotyczących GROUP BY/ HAVINGi kolumn zagregowanych i zawsze zakładałem, że to nie zadziała.
Mihai Stancu
21

Rozważmy nazwę tabeli jako, tblpersona nazwę kolumny jako city. Chcę pobrać najczęściej powtarzane miasto z kolumny miasta:

 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)

Oto noralias.

naveen
źródło
+1 za używanie standardowego SQL, który będzie działał w dowolnej bazie danych (podczas gdy LIMIT jest specyficzny dla MySQL, a TOP jest specyficzny dla SQL Server).
Dylan Smith,
7

Poniższe zapytanie wydaje mi się działać dobrze w bazie danych SQL Server:

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

Wynik:

column          MOST_FREQUENT
item1           highest count
item2           second highest 
item3           third higest
..
..
Swadhikar C.
źródło
3

Do użytku z SQL Server.

Ponieważ nie ma w tym obsługi poleceń limitu.

Możesz użyć pierwszego polecenia, aby znaleźć maksymalną występującą wartość w danej kolumnie w tym przypadku (wartość)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;
Muneeb Hassan
źródło
Musisz także przenieść funkcję COUNT do sekcji ORDER BY, aby uniknąć następującego błędu: Na liście wyboru można określić tylko jedno wyrażenie, jeśli podzapytanie nie jest wprowadzone jako EXISTS
Saba Jamalian
1

Zakładając, że tabela to „ SalesLT.Customer”, a kolumna, którą próbujesz obliczyć, to „ CompanyName” i AggCompanyNamejest aliasem.

Select CompanyName, Count(CompanyName) as AggCompanyName from SalesLT.Customer
group by CompanyName
Order By Count(CompanyName) Desc;
Muzammel Mukul
źródło
0

Jeśli nie możesz użyć LIMIT lub LIMIT nie jest opcją dla twojego narzędzia do wysyłania zapytań. Zamiast tego możesz użyć „ROWNUM”, ale będziesz potrzebować zapytania podrzędnego:

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
Roadkill
źródło
MySQL nie maROWNUM
Barmar
Dotyczy to Oracle, ale nie mysql
Prabhu
1
@Prabhu w MySQL, używasz LIMIT 1zamiast tego; składnia jest pokazana w zaakceptowanej odpowiedzi.
ToolmakerSteve
0

Jeśli masz kolumnę ID i chcesz znaleźć najbardziej powtarzalną kategorię z innej kolumny dla każdego identyfikatora, możesz użyć poniższego zapytania,

Stół:

Zawartość tabeli

Pytanie:

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

Wynik:

Wynik zapytania

Mayur Mane
źródło
-1

Jednym ze sposobów, które lubię używać, jest:

Wybierz ,LICZYĆ() jako VAR1 z Table_Name

Grupuj według

zamówienie VAR1 desc

limit 1

Omar Lari
źródło