Encontre o valor mais frequente na coluna SQL

122

Como posso encontrar o valor mais frequente em uma determinada coluna em uma tabela SQL?

Por exemplo, para esta tabela, ele deve retornar, twopois é o valor mais frequente:

one
two
two
three
Jake
fonte
1
GRUPO POR versão: stackoverflow.com/questions/344665/get-most-common-value-in-sql
Ciro Santilli Última atualização
1
E quanto aos laços? Adicione outra linha 'três' aos dados da amostra e especifique o resultado esperado.
jarlh

Respostas:

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

Substitua columne my_table. Aumente 1se você deseja ver os Nvalores mais comuns da coluna.

Mihai Stancu
fonte
1
o que devo fazer se quiser selecionar outros campos também em 'minha_tabela'? Em outras palavras, outro valor;
grep
7
e se mais de um valor parecer o mesmo número de vezes (que é máximo)? Neste caso, se três também apareceram duas vezes? LIMIT 1 irá mostrar apenas um registro
mustafa1993
1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed
por que não funciona quando adiciono WHERE 'value_occurrence' = 1?
swisswiss
1
@swisswiss você deve usar em HAVINGvez de WHEREneste caso.
21418 HellBaby
47

Tente algo como:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;
Esteira
fonte
6
Eu não sabia que você poderia usar COUNT(*)diretamente no ORDER BY. Eu sabia que havia algumas restrições em relação a GROUP BY/ HAVINGe colunas agregadas e sempre achei que isso não funcionaria.
Mihai Stancu 02/09/12
21

Vamos considerar o nome da tabela como tblpersone o nome da coluna como city. Quero recuperar a cidade mais repetida da coluna da cidade:

 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)

Aqui norestá um nome alternativo.

naveen
fonte
+1 para usar o SQL padrão que funcionará em qualquer banco de dados (enquanto LIMIT é específico do MySQL, TOP é específico do SQL Server).
Dylan Smith
7

A consulta abaixo parece funcionar bem para mim no banco de dados do SQL Server:

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

Resultado:

column          MOST_FREQUENT
item1           highest count
item2           second highest 
item3           third higest
..
..
Swadhikar C
fonte
3

Para uso com o SQL Server.

Como não há suporte ao comando limit nisso.

Você pode usar o comando top 1 para encontrar o valor máximo de ocorrência na coluna específica nesse caso (valor)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;
Muneeb Hassan
fonte
Você também precisa mover a função COUNT para a seção ORDER BY para evitar o seguinte erro: Somente uma expressão pode ser especificada na lista de seleção quando a subconsulta não é introduzida com EXISTS
Saba Jamalian
1

Supondo que a tabela seja ' SalesLT.Customer' e a coluna que você está tentando descobrir seja ' CompanyName' e AggCompanyNameé um alias.

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

Se você não pode usar LIMIT ou LIMIT, não é uma opção para sua ferramenta de consulta. Você pode usar "ROWNUM", mas precisará de uma subconsulta:

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
Estrada da morte
fonte
O MySQL não temROWNUM
Barmar
Isso é válido para Oracle, mas não mysql
Prabhu
1
@ Prabhu no MySQL, você usa LIMIT 1; sintaxe é mostrada na resposta aceita.
Home
0

Se você possui uma coluna de ID e deseja encontrar a categoria mais repetitiva de outra coluna para cada ID, pode usar a consulta abaixo,

Tabela:

Conteúdo da tabela

Inquerir:

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

Resultado:

Resultado da consulta

Mayur Mane
fonte
-1

Uma maneira que eu gosto de usar é:

selecionar ,CONTAGEM() como VAR1 de Table_Name

agrupar por

encomendar por VAR1 desc

limite 1

Omar Lari
fonte