2010-10-03 55 views

Trả lời

33

Bạn có thể sử dụng Biểu thức bảng chung (CTE) để lấy câu trả lời.

Hãy nói rằng bạn có lương sau trong Lương bảng:

EmployeeID Salary 
-------------------- 
    10101 50,000 
    90140 35,000 
    90151 72,000 
    18010 39,000 
    92389 80,000 

Chúng tôi sẽ sử dụng:

DECLARE @N int 
SET @N = 3 -- Change the value here to pick a different salary rank 

SELECT Salary 
FROM (
    SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary 
    FROM Salaries 
) as SalaryCTE 
WHERE SalaryRank = @N 

này sẽ tạo ra một số lượng hàng cho mỗi hàng sau khi đã được sắp xếp theo Mức lương theo thứ tự giảm dần, sau đó lấy hàng thứ ba (có chứa bản ghi cao thứ ba).


Đối với những người bạn của những người không muốn có một CTE (hoặc đang mắc kẹt trong SQL 2000):

[Note: đây thực hiện noticably tồi tệ hơn ví dụ trên; chạy song song với một kế hoạch phòng ngừa cho thấy chi phí truy vấn là 36% cho CTE và 64% cho truy vấn phụ]:

SELECT TOP 1 Salary 
FROM 
(
    SELECT TOP N Salary 
    FROM Salaries 
    ORDER BY Salary DESC 
) SalarySubquery 
ORDER BY Salary ASC 

trong đó N được xác định bởi bạn.

SalarySubquery là bí danh mà tôi đã cung cấp cho truy vấn con hoặc truy vấn nằm trong dấu ngoặc đơn.

Truy vấn con nào chọn N khoản lương hàng đầu (chúng tôi sẽ nói trong trường hợp này) và yêu cầu họ bằng mức lương cao nhất.

Nếu chúng ta muốn nhìn thấy các-cao thứ ba tiền lương, subquery sẽ trở lại:

Salary 
----------- 
80,000 
72,000 
50,000 

Truy vấn bên ngoài sau đó chọn mức lương đầu tiên từ subquery, ngoại trừ chúng ta sắp xếp nó tăng dần thời gian này, từ nhỏ nhất đến lớn nhất, vì vậy 50.000 sẽ là kỷ lục đầu tiên được sắp xếp tăng dần.

Như bạn có thể thấy, 50.000 thực sự là mức lương cao thứ ba trong ví dụ.

+0

phần này không rõ ràng cho tôi có thể giải thích cho tôi SalarySubquery ORDER BY ASC lương – NoviceToDotNet

+0

@NoviceToDotNet - Tôi đã chỉnh sửa câu trả lời của mình dựa trên nhận xét của bạn - Tôi hy vọng họ làm rõ mọi thứ. – LittleBobbyTables

+0

@LittleBobbyTables: Tôi đã chỉnh sửa câu trả lời ur - phần CTE. Nếu đúng, vui lòng chấp nhận các thay đổi, nếu không, hãy sửa tôi. –

12

Bạn có thể sử dụng row_number để chọn một hàng cụ thể. Ví dụ, 42 lương cao nhất:

select * 
from (
     select row_number() over (order by Salary desc) as rn 
     ,  * 
     from YourTable 
     ) as Subquery 
where rn = 42 

chức năng Windowed như row_number chỉ có thể xuất hiện trong select hoặc order by khoản. Giải pháp thay thế là đặt row_number trong truy vấn phụ.

6
select MIN(salary) from (
select top 5 salary from employees order by salary desc) x 
+0

Tôi nghĩ nó đơn giản nhất. làm tốt lắm!! – himanshupareek66

1

cách đơn giản mà không sử dụng bất kỳ tính năng đặc biệt cụ thể đối với Oracle, MySQL, vv Giả sử trong Lương bảng EMPLOYEE có thể được lặp đi lặp lại. Sử dụng truy vấn để tìm hiểu thứ hạng của từng ID.

select * 
from (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from  
EMPLOYEE) where distsal >tout.sal) as rank from EMPLOYEE tout 
) result 
order by rank 

Trước tiên, chúng tôi tìm ra mức lương riêng biệt. Sau đó, chúng tôi tìm ra số tiền lương riêng biệt lớn hơn mỗi hàng. Điều này không là gì ngoài thứ hạng của id đó. Đối với mức lương cao nhất, số tiền này sẽ bằng không. Vì vậy, '+1' được thực hiện để bắt đầu xếp hạng từ 1.

Bây giờ chúng tôi có thể nhận ID ở cấp thứ N bằng cách thêm mệnh đề where vào truy vấn ở trên.

select * 
from (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from  
EMPLOYEE) where distsal >tout.sal) as rank from EMPLOYEE tout 
) result 
where rank = N; 
2

thử nó ...

use table_name 
select MAX(salary) 
from emp_salary 
WHERE marks NOT IN (select MAX(marks) 
from student_marks) 
-3

Rất đơn giản một truy vấn để tìm thứ n lương cao nhất

SELECT DISTINCT(Sal) FROM emp ORDER BY Salary DESC LIMIT n,1 
+1

Thẻ này được gắn thẻ là ** [sql-server] **; SQL Server không có LIMIT từ khóa – LittleBobbyTables

0

Phương pháp đơn giản nhất là để có được 2nd higest salary từ table trong SQL:

sql> select max(sal) from emp where sal not in (select max(sal) from emp); 
1

Dont quên sử dụng từ khóa distinct: -

SELECT TOP 1 Salary 
FROM 
(
    SELECT Distinct TOP N Salary 
    FROM Salaries 
    ORDER BY Salary DESC 
) SalarySubquery 
ORDER BY Salary ASC 
2
EmpID Name Salary 
1 A 100 
2 B 800 
3 C 300 
4 D 400 
5 E 500 
6 F 200 
7 G 600 

SELECT * FROM Employee E1 
WHERE (N-1) = (
       SELECT COUNT(DISTINCT(E2.Salary)) 
       FROM Employee E2 
       WHERE E2.Salary > E1.Salary 
      ) 

Giả sử bạn muốn tìm lương cao nhất 5, có nghĩa là có tất cả 4 nhân viên có lương lớn hơn nhân viên cao nhất 5. Vì vậy, đối với mỗi hàng từ truy vấn bên ngoài, hãy kiểm tra tổng số tiền lương lớn hơn mức lương hiện tại. Truy vấn bên ngoài sẽ làm việc cho 100 đầu tiên và kiểm tra số tiền lương lớn hơn 100. Nó sẽ là 6, không phù hợp với (5-1) = 6 nơi khoản của outerquery. Sau đó, cho 800, và kiểm tra số tiền lương lớn hơn 800, 4=0 sai sau đó làm việc cho 300 và cuối cùng có hoàn toàn 4 bản ghi trong bảng lớn hơn 300. Do đó, 4=4 sẽ đáp ứng mệnh đề where và sẽ trả về 3 C 300.

0

Giải pháp 1: SQL này để tìm lương thứ N cao nhất nên làm việc trong SQL Server, MySQL, DB2, Oracle, Teradata, và hầu hết các RDBMS khác: (lưu ý: hiệu suất thấp vì subquery)

SELECT * /*This is the outer query part */ 
FROM Employee Emp1 
WHERE (N-1) = (/* Subquery starts here */ 
SELECT COUNT(DISTINCT(Emp2.Salary)) 
FROM Employee Emp2 
WHERE Emp2.Salary > Emp1.Salary) 

Điều quan trọng nhất cần hiểu trong truy vấn ở trên là truy vấn con được đánh giá mỗi lần mỗi hàng được truy vấn bên ngoài xử lý. Nói cách khác, truy vấn bên trong không thể được xử lý độc lập với truy vấn bên ngoài vì truy vấn bên trong cũng sử dụng giá trị Emp1.

Để tìm mức lương cao nhất thứ N, chúng tôi chỉ tìm mức lương có chính xác N-1 tiền lương lớn hơn chính nó.


Giải pháp 2: Tìm mức lương cao nhất thứ n sử dụng từ khóa TOP trong SQL Server

SELECT TOP 1 Salary 
FROM (
     SELECT DISTINCT TOP N Salary 
     FROM Employee 
     ORDER BY Salary DESC 
    ) AS Emp 
ORDER BY Salary 

Giải pháp 3: Tìm mức lương cao nhất thứ n trong SQL Server mà không sử dụng TOP

SELECT Salary FROM Employee 
ORDER BY Salary DESC OFFSET N-1 ROW(S) 
FETCH FIRST ROW ONLY 

Lưu ý rằng tôi chưa tự kiểm tra SQL ở trên và tôi tin rằng nó sẽ chỉ hoạt động trong SQL Server 2012 trở lên.

0
SELECT * FROM 
(select distinct postalcode from Customers order by postalcode DESC) 
limit 4,1; 

4 ở đây có nghĩa rời đầu tiên 4 và hiển thị tiếp theo 1.

Hãy thử điều này nó làm việc cho tôi.

+0

Mã bưu điện ở đây là tên cột và Khách hàng là tên bảng. –

Các vấn đề liên quan