Trova il valore più frequente nella colonna SQL


122

Come posso trovare il valore più frequente in una data colonna in una tabella SQL?

Ad esempio, per questa tabella dovrebbe restituire twopoiché è il valore più frequente:

one
two
two
three


1
E i legami? Aggiungi un'altra riga "tre" ai dati di esempio e specifica il risultato previsto.
jarlh

Risposte:


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

Sostituisci columne my_table. Aumenta 1se vuoi vedere i Nvalori più comuni della colonna.


1
cosa devo fare se desidero selezionare anche altri campi da "my_table"? In altre parole, un altro valore;
grep

7
cosa succede se più di un valore appare lo stesso numero di volte (che è il massimo)? In questo caso, se anche tre apparissero due volte? LIMIT 1 mostrerà un solo record
mustafa1993

1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed

perché non funziona quando aggiungo WHERE 'value_occurrence' = 1?
swisswiss

1
@swisswiss devi usare al HAVINGposto di WHEREin questo caso.
HellBaby

47

Prova qualcosa come:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;

6
Non sapevo che potessi usare COUNT(*)direttamente nel file ORDER BY. Sapevo che c'erano alcune restrizioni riguardanti GROUP BY/ HAVINGe le colonne aggregate e ho sempre pensato che non avrebbe funzionato.
Mihai Stancu

21

Consideriamo il nome della tabella come tblpersone il nome della colonna come city. Voglio recuperare la città più ripetuta dalla colonna della città:

 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)

Ecco norun nome alias.


+1 per l'utilizzo di SQL standard che funzionerà in qualsiasi database (mentre LIMIT è specifico per MySQL, TOP è specifico per SQL Server).
Dylan Smith

7

La query seguente sembra funzionare bene per me nel database di SQL Server:

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

Risultato:

column          MOST_FREQUENT
item1           highest count
item2           second highest 
item3           third higest
..
..

3

Da utilizzare con SQL Server.

Poiché non esiste alcun supporto per il comando limite in questo.

Puoi utilizzare il comando in alto 1 per trovare il valore massimo che si verifica nella colonna specifica in questo caso (valore)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;

È inoltre necessario spostare la funzione COUNT nella sezione ORDER BY per evitare di ottenere il seguente errore: È possibile specificare solo un'espressione nell'elenco di selezione quando la sottoquery non è stata introdotta con EXISTS
Saba Jamalian

1

Supponendo che la tabella sia " SalesLT.Customer" e la colonna che stai cercando di capire sia " CompanyName" ed AggCompanyNameè un alias.

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

0

Se non puoi utilizzare LIMIT o LIMIT non è un'opzione per il Query Tool. Puoi invece utilizzare "ROWNUM", ma avrai bisogno di una sottoquery:

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 non haROWNUM
Barmar

Questo è valido per Oracle ma non per mysql
Prabhu

1
@Prabhu in MySQL, usi LIMIT 1invece; la sintassi è mostrata nella risposta accettata.
ToolmakerSteve

0

Se hai una colonna ID e desideri trovare la categoria più ripetitiva da un'altra colonna per ogni ID, puoi utilizzare la query sottostante,

Tavolo:

Contenuto della tabella

Query:

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

Risultato:

Risultato della query


-1

Un modo che mi piace usare è:

Selezionare ,CONTARE() come VAR1 da Table_Name

raggruppa per

ordina per VAR1 disc

limite 1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.