Làm thế nào để tìm third or nth
mức lương tối đa từ mức lương table(EmpID,EmpName,EmpSalary)
theo cách Tối ưu hóa?
Làm thế nào để tìm third or nth
mức lương tối đa từ mức lương table(EmpID,EmpName,EmpSalary)
theo cách Tối ưu hóa?
Câu trả lời:
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
EmpSalary
cột. Ngoài ra, giảm so với những gì? Ưu điểm của ROW_NUMBER
cá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ó.
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
... WHERE (N-1) = (Subquery)...
hoạt động. Truy vấn con là một truy vấn tương quan vì WHERE
mệnh đề của nó sử dụng Emp1
từ 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 > 800
là 0. Đối với giá trị lương thứ 4 (750) ... WHERE Emp2.Salary > 750
sẽ là 2 hoặc N -1, do đó hàng này sẽ được trả lại.
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 ...
Nếu bạn muốn cách tối ưu hóa có nghĩa là sử dụng TOP
Từ 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)
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.
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ó.
Và nguồn
... WHERE (N-1) = (Subquery)...
hoạt động. Truy vấn con là một truy vấn tương quan vì WHERE
mệnh đề của nó sử dụng Emp1
từ 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 > 800
là 0. Đối với giá trị lương thứ 4 (750) ... WHERE Emp2.Salary > 750
sẽ là 2 hoặc N -1, do đó hàng này sẽ được trả lại.
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
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
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.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
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
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 ().
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Đâ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
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
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
- 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 )
Cách tối ưu hóa: Thay vì truy vấn con chỉ sử dụng giới hạn.
select distinct salary from employee order by salary desc limit nth, 1;
Xem cú pháp giới hạn tại đây http://www.mysqltutorial.org/mysql-limit.aspx
Để nhận giá trị cao thứ ba từ bảng
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
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)
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
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Hãy thử mã này: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
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.
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)
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.
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
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.