1
votes

question de requête SQL pour la plupart des noms de la table avec plusieurs noms

fbn table:

select name from fbn 
group by name 
having count(name) = (select count(name) from fbn 
                      group by name 
                      order by count(name) desc
                      limit 1);

quel est le nom le plus fréquent? notez qu'il y a deux noms (Ethan et Lion) qui se produisent le plus souvent. J'ai deux solutions comme ci-dessous:

select tmp2.name 
from (select tmp.name, 
             dense_rank() over(order by tmp.name_count desc) rank
      from (select name, 
                   count(*) name_count 
            from fbn 
            group by name) tmp
      ) tmp2
where tmp2.rank = 1;

et la 2ème solution:

create table fbn (
id int,
name varchar(40),
birthday date,
gender varchar(10));

INSERT into fbn values
(1, "James", "2000-04-22", "male"),
(2, "Julia", "2006-02-27", "female"),
(3, "Ethan", "2013-05-23", "male"),
(4, "Lion", "2014-09-11", "male"),
(5, "Ethan", "2006-01-01", "male"),
(6, "Lion", "2006-02-01", "male");

les deux semblent fonctionner, mais les deux semble trop compliqué. existe-t-il une autre solution plus concise et plus simple à comprendre? Merci


0 commentaires

4 Réponses :


0
votes

Désactivez ONLY_FULL_GROUP_BY s'il est activé en utilisant:

SELECT name, MAX(occurrence) 
FROM (SELECT name, COUNT(id) occurrence
FROM fbn
GROUP BY name) t;

Ici, dans la requête interne, indiquez le nom avec le nombre d'occurrences. Et la requête externe utilise simplement cette table temporaire pour obtenir la valeur de comptage maximale. Maintenant, il renverra une seule ligne avec le nom et l'occurrence totale (max).

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));


2 commentaires

il doit afficher le nom, pas la plupart des occurrences. donc je pense que cela peut être utilisé comme sous-requête, puis ajouter une autre requête pour obtenir le nom.


@NicoHaase Requête mise à jour pour renvoyer le nom. Explication également ajoutée



0
votes

Je pense que vous pouvez simplement:

select count(id) as num_names, name from fbn group by name order by num_names desc limit 1;


1 commentaires

cela peut-il afficher les deux noms qui se lient le plus souvent?



0
votes

Que diriez-vous de ceci:

SELECT counts,GROUP_CONCAT(NAME) AS names
FROM
(SELECT NAME, COUNT(*) counts  FROM fbn GROUP BY NAME) A 
GROUP BY counts 
ORDER BY counts DESC 
LIMIT 1;

Fiddle ici: https://www.db-fiddle.com/f/qzmJAx5LFfzZdYyDetUfex/1


2 commentaires

première fois pour voir group_concat () . Merci d'avoir partagé ça!


Oui, c'est une fonction que j'aime beaucoup utiliser et qui me semble trop parfaite dans votre cas. De cette façon, tant que toute personne ayant le même nombre d'occurrences, elles seront toutes affichées dans le résultat group_concat .



0
votes

Pour Ms:

select Top 1 count(id) as num_names, name from fbn group by name order by num_names desc 


2 commentaires

pas familier avec sql-server, mais cela peut-il générer deux noms qui sont liés le plus souvent?


Non, il ne concatera pas la sortie.