Làm thế nào để tìm mức lương tối đa thứ ba hoặc thứ n từ bảng lương?


Câu trả lời:


82

Sử dụng ROW_NUMBER(nếu bạn muốn một hàng duy nhất) hoặc DENSE_RANK(cho tất cả các hàng liên quan):

WITH CTE AS
(
    SELECT EmpID, EmpName, EmpSalary,
           RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
    FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow

Làm thế nào để có được hồ sơ lương tối thiểu từ bảng? chọn ins.KYS_ID, ins.FKYS_INS_ID từ cmn_pat_x_insurance trong đó ins.FKYS_PAT_ID = '1253_717' và ins.FKYS_INS_TYPE in (1) và ins.BOL_TYPE in (1,3) và ins.salary in (min (ins.salary))
saidesh kilaru

Hãy tưởng tượng, có 10,0000 bản ghi trong bảng nhân viên. Nếu tôi sử dụng truy vấn trên, hiệu suất sẽ giảm từ 6-10 lần.
Bimal Das

1
@BimalDas: thì bạn không có chỉ mục trên EmpSalarycột. Ngoài ra, giảm so với những gì? Ưu điểm của ROW_NUMBERcách tiếp cận là bạn có thể sử dụng ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). Vì vậy, bạn có thể sử dụng nó để lấy các nhóm nhưng vẫn truy cập vào bất kỳ cột nào của nó.
Tim Schmelter

@TimSchmelter WITH CTE sẽ tạo một bảng tạm thời để lưu trữ toàn bộ dữ liệu của câu lệnh SELECT đầu tiên vào đó, sau đó từ kết quả chúng ta chọn "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow". Đó là lý do tại sao tôi đoán nó hơi chậm. Tôi đã kiểm tra nó. và tôi cũng có lập chỉ mục thích hợp.
Bimal Das

2
@BimalDas: Không, nó không tạo một bảng tạm thời. Một cte thường không được hiện thực hóa ở bất kỳ đâu. Nó giống như một chế độ xem nội tuyến hoặc truy vấn con được đặt tên.
Tim Schmelter

88

Số lượng hàng :

SELECT Salary,EmpName
FROM
  (
   SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
   FROM EMPLOYEE
   ) As A
WHERE A.RowNum IN (2,3)

Truy vấn phụ:

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

Từ khoá Hàng đầu:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary

Làm thế nào để có được hồ sơ lương tối thiểu từ bảng? chọn ins.KYS_ID, ins.FKYS_INS_ID từ cmn_pat_x_insurance trong đó ins.FKYS_PAT_ID = '1253_717' và ins.FKYS_INS_TYPE in (1) và ins.BOL_TYPE in (1,3) và ins.salary in (min (ins.salary))
saidesh kilaru

Kumar và Alexander, tôi muốn có thêm một lĩnh vực với nó, làm thế nào để làm điều đó? truy vấn của tôi giống như "" "Chọn 1 NoteID hàng đầu Từ (Chọn DateDiff (Year, SchedualDate, Current_TimeStamp) làm NoteAge, Phân biệt 3 NoteID hàng đầu Từ [dbo]. [DocSecheduale] Đặt hàng theo NoteID Desc) một Đơn hàng theo NoteID" ""
Zaveed Abbasi

Tôi đang tìm kiếm thứ n lương cao nhất nhưng tôi đang nhận được sự phức tạp để hiểu được phụ truy vấn, bạn muốn giải thích những phụ truy vấn ...
Deepak Gupta

@deepak_java truy vấn con được đánh giá mỗi và mỗi khi một 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.
Kumar Manish

Điều quan trọng là phải hiểu tại sao nó ... WHERE (N-1) = (Subquery)...hoạt động. Truy vấn con là một truy vấn tương quan vì WHEREmệnh đề của nó sử dụng Emp1từ truy vấn chính. Truy vấn phụ được đánh giá mỗi khi truy vấn chính quét qua một hàng. Ví dụ, nếu chúng ta tìm mức lương lớn thứ 3 (N = 3) từ (800, 1000, 700, 750), truy vấn con cho hàng đầu tiên sẽ SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800là 0. Đối với giá trị lương thứ 4 (750) ... WHERE Emp2.Salary > 750sẽ là 2 hoặc N -1, do đó hàng này sẽ được trả lại.
jerrymouse

65

Thử cái này

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

Đối với 3, bạn có thể thay thế bất kỳ giá trị nào ...


cái này có tác dụng với oracle 10g hay 11g không? Hay có một giải pháp thay thế đẹp như thế này?
RBz 28/09/18

40

Nếu bạn muốn cách tối ưu hóa có nghĩa là sử dụng TOPTừ khóa, Vì vậy, truy vấn mức lương tối đa và tối thiểu thứ n như sau nhưng các truy vấn trông phức tạp như theo thứ tự ngược lại bằng cách sử dụng tên hàm tổng hợp:

N mức lương tối đa:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

cho Ex: 3 mức lương tối đa:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

Mức lương tối thiểu N:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)

cho Ví dụ: 3 mức lương tối thiểu:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)

Đơn giản nhất và dễ nhớ nhất. +1
Sнаđошƒаӽ

4
để nhận được mức lương tối đa tại sao chúng ta làm theo thứ tự ASC, nó phải được thực hiện theo thứ tự DESC, nếu chúng ta có mức lương như thế này 7000,10000,11000,500,800,900,12000, thì truy vấn sắp xếp bên trong sẽ dẫn đến top 3, nghĩa là 500,800,900 và max trong số này là 900, nhưng 900 không phải là 3 tối đa, 3 mức lương tối đa là 10000.
Narendra Jaggi

1
cho Ex: 3 lương tối đa: Nó phải được như thế CHỌN Min (EmpSalary) TỪ Lương ĐÂU EmpSalary TRÊN (SELECT TOP 3 EmpSalary TỪ Lương ORDER BY EmpSalary DESC)
Jimit Rupani

15

Quá đơn giản nếu bạn sử dụng truy vấn phụ!

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

Ở đây bạn có thể chỉ cần thay đổi giá trị thứ n sau ràng buộc LIMIT.

Tại đây, truy vấn phụ Chọn EmpSalary từ Đơn đặt hàng của nhân viên theo EmpSalary DESC Giới hạn 3; sẽ trả lại 3 mức lương cao nhất của Nhân viên. Ra kết quả ta sẽ chọn Mức lương tối thiểu bằng lệnh MIN để lấy mức lương TOP thứ 3 của nhân viên.


Gặp lỗi này. Error Code: 1248 Mỗi nguồn gốc bảng phải có bí danh riêng của mình

thêm bí danh cho nó .. SELECT MIN (EmpSalary) from (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) as s;
anonxss

Chỉ cần sử dụng DISTINCT để tránh trùng lặp SELECT MIN (EmpSalary) from (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh

14

Thay thế N bằng Số tối đa của bạn

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

Giải trình

Truy vấn ở trên có thể khá khó hiểu nếu bạn chưa từng thấy bất kỳ điều gì giống nó trước đây - truy vấn bên trong được gọi là truy vấn phụ tương quan vì truy vấn bên trong (truy vấn con) sử dụng một giá trị từ truy vấn bên ngoài (trong trường hợp này là bảng Emp1 ) trong mệnh đề WHERE của nó.

nguồn


+1 Điều quan trọng là phải hiểu lý do tại sao ... WHERE (N-1) = (Subquery)...hoạt động. Truy vấn con là một truy vấn tương quan vì WHEREmệnh đề của nó sử dụng Emp1từ truy vấn chính. Truy vấn phụ được đánh giá mỗi khi truy vấn chính quét qua một hàng. Ví dụ, nếu chúng ta tìm mức lương lớn thứ 3 (N = 3) từ (800, 1000, 700, 750), truy vấn con cho hàng đầu tiên sẽ SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800là 0. Đối với giá trị lương thứ 4 (750) ... WHERE Emp2.Salary > 750sẽ là 2 hoặc N -1, do đó hàng này sẽ được trả lại.
jerrymouse

13

Mức lương tối đa thứ ba hoặc thứ n từ bảng lương mà không sử dụng truy vấn con

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

Đối với mức lương cao thứ 3, xếp 2 vào vị trí N-1


3
Điều quan trọng cần đề cập là OFFSET FETCH có sẵn từ phiên bản SQL Server 2012 +.
Zerotoinfinity

11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3

1
Cảm ơn vì DENSE_RANK () Tôi chưa bao giờ nghe nói về nó
Vivekh

8

Tham khảo truy vấn sau để nhận được mức lương cao thứ n. Bằng cách này, bạn sẽ nhận được mức lương cao thứ n trong MYSQL. Nếu bạn muốn nhận được mức lương thấp nhất thứ n, bạn chỉ cần thay thế DESC bằng ASC trong truy vấn. lương cao thứ n


1
Câu hỏi là về SQL-Server không phải MySQL.
bummi


6

Phương pháp 1:

SELECT TOP 1 salary FROM (
SELECT TOP 3 salary 
 FROM employees 
  ORDER BY salary DESC) AS emp 
 ORDER BY salary ASC

Phương pháp 2:

  Select EmpName,salary from
  (
    select EmpName,salary ,Row_Number() over(order by salary desc) as rowid      
     from EmpTbl)
   as a where rowid=3

Phương pháp 1 có thể loại: SELECT TOP 1 LƯƠNG TỪ (SELECT TOP 3 LƯƠNG TỪ NHÂN VIÊN) * ở mức hợp lý vì theo mặc định thứ tự tăng dần của nó
Ashish Agrawal Yodlee

5

Trong năm 2008, chúng tôi có thể sử dụng ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) để có thứ hạng mà chúng tôi có thể sử dụng.

Ví dụ: chúng ta có thể nhận được mức cao thứ 8 theo cách này hoặc thay đổi @N thành một cái gì đó khác hoặc sử dụng nó làm tham số trong một hàm nếu bạn muốn.

DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;

Trong SQL Server 2012 như bạn có thể biết, điều này được thực hiện trực quan hơn bằng cách sử dụng LAG ().



3

Đây là một trong những câu hỏi phổ biến trong bất kỳ cuộc phỏng vấn SQL nào. Tôi sẽ viết ra các truy vấn khác nhau để tìm ra giá trị cao thứ n của một cột.

Tôi đã tạo một bảng có tên “Emloyee” bằng cách chạy tập lệnh bên dưới.

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

Bây giờ tôi sẽ chèn 8 hàng vào bảng này bằng cách chạy câu lệnh chèn bên dưới.

insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)

Bây giờ chúng ta sẽ tìm ra Basic_sal cao thứ 3 từ bảng trên bằng cách sử dụng các truy vấn khác nhau. Tôi đã chạy truy vấn dưới đây trong phòng thu quản lý và dưới đây là kết quả.

select * from Employee order by Basic_Sal desc

Chúng ta có thể thấy trong hình trên rằng Mức lương cơ bản cao thứ 3 sẽ là 8500. Tôi đang viết 3 cách khác nhau để làm việc tương tự. Bằng cách chạy cả ba truy vấn được đề cập bên dưới, chúng ta sẽ nhận được cùng một kết quả, tức là 8500.

Cách đầu tiên: - Sử dụng chức năng số hàng

select Ename,Basic_sal
from(
            select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
      )A
where rowid=2

3
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

Tôi đang có mức lương cao thứ 3


3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'

3

- mức lương cao nhất

select * 
from (select lstName, salary, row_number() over( order by salary desc) as rn 
      from employee) tmp
where rn = 2

- (thứ -1) mức lương cao nhất

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )


3

Để nhận giá trị cao thứ ba từ bảng

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1

CHỌN ColumnName biệt TỪ tableName ORDER BY ColumnName DESC LIMIT 2, 1
Devendra Singraul

2

Bằng truy vấn con:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)

1

Hãy thử truy vấn này

SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary) 
FROM emp WHERE E.salary <= salary)

Đặt n = giá trị nào bạn muốn


1
set @n = $n

SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n

1

Giải pháp thử nghiệm MySQL, giả sử N = 4:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

Một vi dụ khac:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);

1

Hãy thử mã này: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )

1
select * from employee order by salary desc;

+------+------+------+-----------+
| id   | name | age  | salary    |
+------+------+------+-----------+
|    5 | AJ   |   20 | 100000.00 |
|    4 | Ajay |   25 |  80000.00 |
|    2 | ASM  |   28 |  50000.00 |
|    3 | AM   |   22 |  50000.00 |
|    1 | AJ   |   24 |  30000.00 |
|    6 | Riu  |   20 |  20000.00 |
+------+------+------+-----------+




select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);

Thay n bằng số lương cao nhất thứ n.


0

Hãy thử cái này ...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)

0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

Đối với mức lương cao thứ 2, hãy thay đổi 3 thành 2 trong truy vấn trên và cho mức lương cao nhất thứ N thành N với N = 1,2,3,4 ...


0

SELECT * FROM (chọn mức lương khác biệt với mức lương Khách hàng đặt hàng theo mức lương DESC) giới hạn 4,1;

Giới hạn 4,1 có nghĩa là để lại 4 hàng đầu tiên và sau đó chọn hàng tiếp theo.

Giới hạn và rownumber phụ thuộc vào nền tảng bạn đang sử dụng.

Hãy thử điều này, nó sẽ hoạt động.


0

LƯU Ý: Vui lòng thay thế OFFSET 3 trong Truy vấn bằng BẤT KỲ số nguyên thứ N nào

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

Sự miêu tả

CHỈ TÌM HIỂU 1 CON ĐƯỜNG TIẾP THEO

chỉ trả lại 1 hàng

OFFSET 3 ROWS

loại trừ 3 bản ghi đầu tiên Ở đây bạn có thể cho bạn bất kỳ số nguyên nào


0

Truy vấn con luôn mất nhiều thời gian hơn:

sử dụng truy vấn dưới đây để nhận bất kỳ dữ liệu cao nhất và thấp nhất nào:

Dữ liệu cao nhất: select *from business order by id desc limit 3,1;

Dữ liệu thấp nhất: select *from business order by id asc limit 3,1;

Có thể sử dụng N ở vị trí của 3 để lấy dữ liệu thứ n.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.