2011-10-09 67 views
9

Tôi đã xem các ví dụ trong đó truy vấn theo số lượng và nhận hàng trên cùng, nhưng trong trường hợp này có thể có nhiều giá trị "thường xuyên nhất", vì vậy tôi có thể muốn trả về nhiều hơn một kết quả.cách chọn các giá trị xuất hiện thường xuyên nhất?

Trong trường hợp này tôi muốn tìm những cái tên cuối cùng thường xuyên nhất xuất hiện trong một bảng người dùng, đây là những gì tôi có cho đến nay:

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

Thật không may với truy vấn này tôi nhận được một lỗi mà chức năng tối đa của tôi được lồng quá sâu sắc.

Trả lời

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 

Sử dụng chức năng phân tích rank. Nó sẽ chỉ định một số dựa trên thứ tự của count(*) desc. Nếu hai tên có cùng số lượng, chúng sẽ có cùng thứ hạng và số tiếp theo sẽ bị bỏ qua (vì vậy bạn có thể nhận được các hàng có xếp hạng 1, 1 và 3). dense_rank là một thay thế không bỏ qua số tiếp theo nếu hai hàng có cùng thứ hạng, (vì vậy bạn sẽ nhận được 1, 1, 2), nhưng nếu bạn chỉ muốn các hàng có xếp hạng 1, không có nhiều Sự khác biệt.

Nếu bạn chỉ muốn một hàng, bạn muốn mỗi hàng có một số khác nhau. Trong trường hợp đó, hãy sử dụng row_number. Ngoài sự khác biệt nhỏ nhưng quan trọng này, các chức năng này tương tự nhau và có thể được sử dụng theo cách tương tự.

+0

Câu trả lời hay! Cảm ơn – InkHeart

+0

Tôi tin rằng câu trả lời này là không chính xác lại: xếp hạng dày đặc. thứ hạng dày đặc sẽ vẫn trả về cả hai con số ở trên cùng, nó sẽ không bỏ qua các số thứ hạng tiếp theo. row_number sẽ không bao gồm cả hai số với nhau. –

+0

@MikeS Cảm ơn! Bạn nói đúng, và tôi không biết tôi đang ở đâu với tâm trí của mình khi tôi viết nó. 'rank' và' dense_rank' cả hai có thể trả về cùng một số cho nhiều hàng, nếu chúng là 'bằng' theo phân loại đã chỉ định. Tôi đã chỉnh sửa văn bản. – GolezTrol

5
select name 
from 
    (select name, count(1) 
     from table 
     group by name 
     order by count(1) desc) a 
where rownum = 1 
Các vấn đề liên quan