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


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.


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;

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.


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

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;

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;

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

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


-1

Uma maneira que eu gosto de usar é:

selecionar ,CONTAGEM() como VAR1 de Table_Name

agrupar por

encomendar por VAR1 desc

limite 1

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.