select
x.last_name,
x.name_count
from
(select
u.last_name,
count(*) as name_count,
rank() over (order by count(*) desc) as rank
from
users u
group by
u.last_name) x
where
x.rank = 1
Utiliser la fonction analytique rank
. Il attribuera une numérotation basée sur l'ordre de count(*) desc
. Si deux noms ont le même nombre, ils obtiennent le même rang et le numéro suivant est ignoré (vous pouvez donc obtenir des lignes ayant les rangs 1, 1 et 3). dense_rank
est une alternative qui ne saute pas le numéro suivant si deux lignes ont le même rang (vous obtiendrez donc 1, 1, 2), mais si vous ne voulez que les lignes avec le rang 1, il n'y a pas beaucoup de différence .
Si vous ne voulez qu'une seule ligne, vous voudriez que chaque ligne ait un numéro différent. Dans ce cas, utilisez row_number
. Hormis cette petite mais importante différence, ces fonctions sont similaires et peuvent être utilisées de la même manière.