2011-10-09 11 views
9

Ho visto esempi in cui la query ordina per conteggio e prende la riga superiore, ma in questo caso possono esserci più valori "più frequenti", quindi potrei voler restituire più di un singolo risultato.come selezionare i valori visualizzati più frequentemente?

In questo caso voglio trovare le appaiono più di frequente cognomi in una tabella gli utenti, ecco cosa ho finora:

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

Purtroppo con questa query ottengo un errore che la mia funzione max è annidata troppo profondamente.

risposta

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 

Utilizzare la funzione analitica rank. Assegnerà una numerazione basata sull'ordine di count(*) desc. Se due nomi hanno lo stesso conteggio, ottengono lo stesso valore, e il numero successivo viene saltato (quindi potresti ottenere le righe che hanno ranghi 1, 1 e 3). dense_rank è un'alternativa che non salta il numero successivo se due righe hanno lo stesso valore, (quindi otterresti 1, 1, 2), ma se vuoi solo le righe con il grado 1, non c'è molto di un differenza.

Se si desidera una sola riga, si desidera che ciascuna riga abbia un numero diverso. In tal caso, utilizzare row_number. A parte questa piccola ma importante differenza, queste funzioni sono simili e possono essere utilizzate allo stesso modo.

+0

Ottima risposta! Grazie – InkHeart

+0

Credo che questa risposta non sia corretta. Rango denso. il rank denso restituirebbe entrambi i numeri in cima, non salterà i numeri di rank successivi. row_number non includerebbe entrambi i numeri insieme. –

+0

@MikeS Grazie! Hai ragione, e non so dove fossi con la mente quando l'ho scritta. 'rank' e' dense_rank' entrambi possono restituire lo stesso numero per più righe, se sono 'uguali' in base all'ordinamento specificato. Ho corretto il testo. – GolezTrol

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