2013-04-11 11 views
19

Tôi có bảng có dữ liệu về các thành phố bao gồm tên, dân số và các trường khác không liên quan đến câu hỏi của tôi.Tìm giá trị lớn nhất và hiển thị giá trị tương ứng từ trường khác nhau trong máy chủ SQL

ID  Name Population 
1  A  45667 
2  B  123456 
3  C  3005  
4  D  13769 

Để tìm dân số tối đa là cơ bản, nhưng tôi cần một bảng kết quả rằng có dân số tối đa trong một cột, và tên thành phố tương ứng trong một cột

Population  Name  
123456   B  

Tôi đã nhìn qua similar câu hỏi, nhưng vì lý do nào đó các câu trả lời trông quá phức tạp. Có cách nào để viết truy vấn trong 1 hoặc 2 dòng không?

+1

Bạn có thể có nhiều thành phố với số lượng (tối đa) đã cho. Có thể chấp nhận kết quả nhiều bản ghi cho bạn không? – Pino

+0

bảng là dữ liệu thực tế của các thành phố ở Hoa Kỳ, vì vậy không có bản sao. – HDunn

+5

Tôi nghĩ bạn không biết luật Murphy :-) – Pino

Trả lời

30

Có một số cách mà điều này có thể được thực hiện:

Một bộ lọc trong mệnh đề WHERE:

select id, name, population 
from yourtable 
where population in (select max(population) 
        from yourtable) 

Hoặc một subquery:

select id, name, population 
from yourtable t1 
inner join 
(
    select max(population) MaxPop 
    from yourtable 
) t2 
    on t1.population = t2.maxpop; 

Hoặc bạn có thể sử dụng TOP WITH TIES. Nếu không có mối quan hệ, bạn có thể xóa with ties. Điều này sẽ bao gồm bất kỳ hàng nào có giá trị dân cùng:

select top 1 with ties id, name, population 
from yourtable 
order by population desc 

Vì bạn đang sử dụng SQL Server bạn cũng có thể sử dụng chức năng xếp hạng để có được kết quả:

select id, name, population 
from 
(
    select id, name, population, 
    row_number() over(order by population desc) rn 
    from yourtable 
) src 
where rn = 1 

Xem SQL Fiddle with Demo của tất cả.

Là một lưu ý phụ về chức năng xếp hạng, bạn có thể muốn sử dụng dense_rank() thay vì row_number(). Sau đó, trong trường hợp bạn có nhiều thành phố có cùng dân số, bạn sẽ nhận được cả hai tên thành phố. (Xem Demo)

+0

Ví dụ đầu tiên hoạt động, cảm ơn. – HDunn

+3

@HDunn Bạn được chào đón, tôi muốn cho bạn thấy một số phiên bản làm việc. :) – Taryn

+2

"order by .... desc limit 1" là một ý tưởng đơn giản và tốt đẹp, điều đó không xảy ra trong tâm trí đôi khi :) – Dexter