Encuentra el valor más frecuente en la columna SQL

122

¿Cómo puedo encontrar el valor más frecuente en una columna dada en una tabla SQL?

Por ejemplo, para esta tabla debería regresar twoya que es el valor más frecuente:

one
two
two
three
Jake
fuente
1
Versión GROUP BY: stackoverflow.com/questions/344665/get-most-common-value-in-sql
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
¿Qué hay de los lazos? Agregue otra fila 'tres' a los datos de muestra y especifique el resultado esperado.
jarlh

Respuestas:

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

Reemplazar columny my_table. Aumente 1si desea ver los Nvalores más comunes de la columna.

Mihai Stancu
fuente
1
¿Qué debo hacer si quiero seleccionar otros campos también de 'my_table'? En otras palabras, otro valor;
grep
77
¿Qué pasa si más de un valor aparece el mismo número de veces (que es máximo)? En este caso, si tres también aparecieron dos veces? LÍMITE 1 mostrará solo un registro
mustafa1993
1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed
¿Por qué no funciona cuando agrego WHERE 'value_occurrence' = 1?
swisswiss
1
@swisswiss debe usar en HAVINGlugar de WHEREen este caso.
HellBaby
47

Intenta algo como:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;
Estera
fuente
66
No sabía que podías usar COUNT(*)directamente en el ORDER BY. Sabía que había algunas restricciones con respecto a las columnas agregadas y GROUP BY/ HAVINGy siempre supuse que eso no funcionaría.
Mihai Stancu
21

Consideremos el nombre de la tabla como tblpersony el nombre de la columna como city. Quiero recuperar la ciudad más repetida de la columna de la ciudad:

 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)

Aquí norhay un nombre de alias.

naveen
fuente
+1 por usar SQL estándar que funcionará en cualquier base de datos (mientras que LIMIT es específico de MySQL, TOP es específico de SQL Server).
Dylan Smith
7

La consulta a continuación parece funcionar bien para mí en la base de datos de 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
fuente
3

Para usar con SQL Server.

Como no hay soporte de comando de límite en eso.

En este caso, puede usar el comando top 1 para encontrar el valor máximo en la columna en particular (valor)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;
Muneeb Hassan
fuente
También debe mover la función COUNT a la sección ORDER BY para evitar el siguiente error: solo se puede especificar una expresión en la lista de selección cuando la subconsulta no se introduce con EXISTS
Saba Jamalian
1

Suponiendo que la tabla es " SalesLT.Customer" y la columna que está tratando de averiguar es " CompanyName" y AggCompanyNamees un alias.

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

Si no puede usar LIMIT o LIMIT no es una opción para su herramienta de consulta. Puede usar "ROWNUM" en su lugar, pero necesitará una 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
Roadkill
fuente
MySQL no tieneROWNUM
Barmar
Esto es válido para Oracle pero no mysql
Prabhu
1
@Prabhu en MySQL, usas en su LIMIT 1lugar; La sintaxis se muestra en la respuesta aceptada.
ToolmakerSteve
0

Si tiene una columna de ID y desea encontrar la categoría más repetitiva de otra columna para cada ID, puede usar la consulta a continuación,

Mesa:

Contenido de la tabla

Consulta:

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 de la consulta

Mayur Mane
fuente
-1

Una forma que me gusta usar es:

Seleccione ,CONTAR() como VAR1 de Table_Name

agrupar por

ordenar por VAR1 desc

límite 1

Omar Lari
fuente