Rechercher la valeur la plus fréquente dans la colonne SQL

122

Comment puis-je trouver la valeur la plus fréquente dans une colonne donnée dans une table SQL?

Par exemple, pour cette table, il doit renvoyer twocar il s'agit de la valeur la plus fréquente:

one
two
two
three
Jake
la source
1
Version GROUP BY: stackoverflow.com/questions/344665/get-most-common-value-in-sql
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Et les cravates? Ajoutez une autre ligne «trois» aux données d'exemple et spécifiez le résultat attendu.
jarlh

Réponses:

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

Remplacez columnet my_table. Augmentez 1si vous souhaitez afficher les Nvaleurs les plus courantes de la colonne.

Mihai Stancu
la source
1
que dois-je faire si je veux également sélectionner un autre champ dans «ma_table»? En d'autres termes, une autre valeur;
grep
7
que se passe-t-il si plus d'une valeur apparaît le même nombre de fois (ce qui est max)? Dans ce cas, si trois sont également apparus deux fois? LIMIT 1 n'affichera qu'un seul enregistrement
mustafa1993
1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ahmed Syed
pourquoi ça ne marche pas quand j'ajoute WHERE 'value_occurrence' = 1?
swisswiss
1
@swisswiss vous devez utiliser à la HAVINGplace de WHEREdans ce cas.
HellBaby
47

Essayez quelque chose comme:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;
Tapis
la source
6
Je ne savais pas que vous pouviez utiliser COUNT(*)directement dans le ORDER BY. Je savais qu'il y avait quelques restrictions concernant GROUP BY/ HAVINGet les colonnes agrégées et j'ai toujours pensé que cela ne fonctionnerait pas.
Mihai Stancu le
21

Considérons le nom de la table comme tblpersonet le nom de la colonne comme city. Je veux récupérer la ville la plus répétée de la colonne ville:

 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)

Voici norun nom d'alias.

Naveen
la source
+1 pour l'utilisation de SQL standard qui fonctionnera dans n'importe quelle base de données (alors que LIMIT est spécifique à MySQL, TOP est spécifique à SQL Server).
Dylan Smith
7

La requête ci-dessous semble bien fonctionner pour moi dans la base de données SQL Server:

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

Résultat:

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

À utiliser avec SQL Server.

Comme il n'y a pas de support de commande de limite dans cela.

Vous pouvez utiliser la commande top 1 pour trouver la valeur maximale dans la colonne particulière dans ce cas (valeur)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;
Muneeb Hassan
la source
Vous devez également déplacer la fonction COUNT vers la section ORDER BY pour éviter d'obtenir l'erreur suivante: Une seule expression peut être spécifiée dans la liste de sélection lorsque la sous-requête n'est pas introduite avec EXISTS
Saba Jamalian
1

En supposant que la table est « SalesLT.Customer» et que la colonne que vous essayez de comprendre est « CompanyName» et AggCompanyNameest un alias.

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

Si vous ne pouvez pas utiliser LIMIT ou LIMIT n'est pas une option pour votre outil de requête. Vous pouvez utiliser "ROWNUM" à la place, mais vous aurez besoin d'une sous-requête:

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
la source
MySQL n'a pasROWNUM
Barmar
Ceci est valable pour oracle mais pas pour mysql
Prabhu
1
@Prabhu dans MySQL, vous utilisez à la LIMIT 1place; la syntaxe est indiquée dans la réponse acceptée.
ToolmakerSteve
0

Si vous avez une colonne ID et que vous souhaitez rechercher la catégorie la plus répétitive d'une autre colonne pour chaque ID, vous pouvez utiliser la requête ci-dessous,

Table:

Contenu de la table

Requete:

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

Résultat:

Résultat de la requête

Mayur Mane
la source
-1

Une manière que j'aime utiliser est:

sélectionner ,COMPTER() comme VAR1 à partir de Table_Name

par groupe

ordre par VAR1 desc

limite 1

Omar Lari
la source