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


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.


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;

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.


+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
..
..

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;

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;

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

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


-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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.