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
4 Réponses :
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',''));
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
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;
cela peut-il afficher les deux noms qui se lient le plus souvent?
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
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 .
Pour Ms:
select Top 1 count(id) as num_names, name from fbn group by name order by num_names desc
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.