2011-10-09 11 views
9

Widziałem przykłady, w których zapytania są sortowane według liczby i zajmują najwyższy wiersz, ale w tym przypadku może być wiele "najczęstszych" wartości, więc mogę chcieć zwrócić więcej niż jeden wynik.jak wybrać najczęściej pojawiające się wartości?

W tym przypadku chcę, aby znaleźć najczęściej występujących nazwisk w tabeli użytkowników, oto co mam do tej pory:

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

Niestety z tego zapytania pojawia się błąd, że moja funkcja max jest zagnieżdżony zbyt głęboko.

Odpowiedz

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 

Użyj funkcji analitycznej rank. Przypisuje numerację na podstawie numeru count(*) desc. Jeśli dwie nazwy mają taką samą liczbę, otrzymują tę samą rangę, a następna liczba jest pomijana (możesz więc uzyskać wiersze z szeregami 1, 1 i 3). dense_rank jest alternatywą, która nie pomija następnego numeru, jeśli dwa wiersze mają tę samą wartość, (więc otrzymasz 1, 1, 2), ale jeśli chcesz tylko wiersze z rangą 1, nie ma zbyt wiele różnica.

Jeśli chcesz tylko jeden wiersz, chcesz, aby każdy wiersz miał inny numer. W takim przypadku użyj row_number. Oprócz tej niewielkiej, ale ważnej różnicy, funkcje te są podobne i mogą być używane w ten sam sposób.

+0

Świetna odpowiedź! Dzięki – InkHeart

+0

Wierzę, że ta odpowiedź jest niepoprawna: gęsta ranga. gęsta ranga nadal zwróciłaby obie liczby u góry, po prostu nie pomijałaby kolejnych numerów rang. numer_wiersza nie zawierał jednocześnie obu liczb. –

+0

@MikeS Dzięki! Masz rację i nie wiem, gdzie byłem z moim umysłem, kiedy to napisałem. 'rank' i' dense_rank' mogą zwracać tę samą liczbę dla wielu wierszy, jeśli są "równe" zgodnie z określonym sortowaniem. Poprawiłem tekst. – GolezTrol

5
select name 
from 
    (select name, count(1) 
     from table 
     group by name 
     order by count(1) desc) a 
where rownum = 1 
Powiązane problemy