2011-10-09 8 views
9

He visto ejemplos en los que la consulta ordena por conteo y toma la fila superior, pero en este caso puede haber múltiples valores "más frecuentes", por lo tanto, es posible que desee devolver más de un solo resultado.cómo seleccionar los valores que aparecen con más frecuencia?

En este caso quiero encontrar los más frecuentemente aparecen apellidos en una tabla de usuarios, esto es lo que tengo hasta ahora:

select last_name from users group by last_name having max(count(*)); 

Lamentablemente con esta consulta me sale un error que se anida mi función max muy profundamente

Respuesta

23
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 

Utilice la función analítica rank. Asignará una numeración basada en el orden de count(*) desc. Si dos nombres obtuvieron el mismo conteo, obtendrán el mismo rango, y el próximo número se omitirá (por lo que es posible que obtenga filas con los rangos 1, 1 y 3). dense_rank es una alternativa que no omite el siguiente número si dos filas obtuvieron el mismo rango (para que obtenga 1, 1, 2), pero si solo desea las filas con el rango 1, no hay mucho de diferencia.

Si solo quiere una fila, querrá que cada fila tenga un número diferente. En ese caso, use row_number. Además de esta diferencia pequeña pero importante, estas funciones son similares y se pueden usar de la misma manera.

+0

¡Excelente respuesta! Gracias – InkHeart

+0

Creo que esta respuesta es incorrecta re: rango denso. el rango denso aún devolvería ambos números en la parte superior, simplemente no saltaría los siguientes números de rango. row_number no incluiría ambos números juntos. –

+0

@MikeS Gracias! Tienes razón, y no sé dónde estaba con mi mente cuando lo escribí. 'rank' y' dense_rank' ambos pueden devolver el mismo número para varias filas, si son 'iguales' según la clasificación especificada. He corregido el texto. – GolezTrol

5
select name 
from 
    (select name, count(1) 
     from table 
     group by name 
     order by count(1) desc) a 
where rownum = 1 
Cuestiones relacionadas