답변:
사용 ROW_NUMBER하거나 (단일 원하는 경우) DENSE_RANK(관련된 모든 행에 대한)를 :
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열에 인덱스가 없습니다 . 또한 무엇에 비해 감소? ROW_NUMBER접근 방식 의 장점은 ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). 따라서 그룹을 가져 오는 데 사용할 수 있지만 여전히 모든 열에 액세스 할 수 있습니다.
행 번호 :
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)
하위 쿼리 :
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
상위 키워드 :
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...작동 하는지 이해하는 것이 중요 합니다. 하위 쿼리는 해당 WHERE절이 Emp1주 쿼리에서 사용하기 때문에 상관 쿼리입니다. 하위 쿼리는 기본 쿼리가 행을 스캔 할 때마다 평가됩니다. 예를 들어 (800, 1000, 700, 750)에서 세 번째로 큰 급여 (N = 3)를 찾으려면 첫 번째 행에 대한 하위 쿼리 SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800는 0이됩니다. 네 번째 급여 값 (750)의 ... WHERE Emp2.Salary > 750경우 2 또는 N -1이므로이 행이 반환됩니다.
최적화 방법을 원한다면 TOP키워드 사용을 의미 하므로 nth max 및 min salaries 쿼리는 다음과 같지만 쿼리는 집계 함수 이름을 사용하여 역순으로 까다로워 보입니다.
N 최대 급여 :
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
예 : 3 최대 급여 :
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
N 최소 급여 :
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
예 : 3 최저 급여 :
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
하위 쿼리를 사용하면 너무 간단합니다!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
여기에서 LIMIT 제약 후 n 번째 값만 변경할 수 있습니다.
여기이 하위 쿼리는 EmpSalary DESC Limit 3에 의해 Employee Order에서 EmpSalary를 선택합니다. 직원의 최고 급여 3 개를 반환합니다. 결과에서 직원의 세 번째 TOP 급여를 얻기 위해 MIN 명령을 사용하여 최소 급여를 선택합니다.
N을 최대 숫자로 바꿉니다.
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
설명
위의 쿼리는 이전에 이와 같은 것을 본 적이없는 경우 매우 혼란 스러울 수 있습니다. 내부 쿼리 (서브 쿼리)는 외부 쿼리 (이 경우 Emp1 테이블)의 값을 사용하기 때문에 내부 쿼리는 상관 하위 쿼리라고합니다. ) WHERE 절입니다.
그리고 소스
... WHERE (N-1) = (Subquery)...작동 하는지 이해하는 것이 중요 합니다. 하위 쿼리는 해당 WHERE절이 Emp1주 쿼리에서 사용하기 때문에 상관 쿼리입니다. 하위 쿼리는 기본 쿼리가 행을 스캔 할 때마다 평가됩니다. 예를 들어 (800, 1000, 700, 750)에서 세 번째로 큰 급여 (N = 3)를 찾으려면 첫 번째 행에 대한 하위 쿼리 SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800는 0이됩니다. 네 번째 급여 값 (750)의 ... WHERE Emp2.Salary > 750경우 2 또는 N -1이므로이 행이 반환됩니다.
하위 쿼리를 사용하지 않고 급여 테이블의 세 번째 또는 n 번째 최대 급여
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
세 번째로 높은 급여의 경우 N-1 대신 2를 입력합니다.
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
n 번째로 높은 급여를 받으려면 다음 쿼리를 참조하십시오. 이렇게하면 MYSQL에서 n 번째로 높은 급여를받습니다. n 번째로 낮은 급여를 받으려면 쿼리에서 DESC를 ASC로 바꾸면됩니다.

SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
방법 1 :
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
방법 2 :
Select EmpName,salary from
(
select EmpName,salary ,Row_Number() over(order by salary desc) as rowid
from EmpTbl)
as a where rowid=3
2008 년에는 ROW_NUMBER () OVER (ORDER BY EmpSalary DESC)를 사용하여 동점없이 사용할 수있는 순위를 얻을 수 있습니다.
예를 들어이 방법으로 8 번째로 높은 값을 얻거나 @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;
SQL Server 2012에서는 LAG ()를 사용하여보다 직관적으로 수행됩니다.
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
이것은 모든 SQL 인터뷰에서 인기있는 질문 중 하나입니다. 열에서 n 번째로 높은 값을 찾기 위해 다른 쿼리를 작성하겠습니다.
아래 스크립트를 실행하여 "Emloyee"라는 테이블을 만들었습니다.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
이제 insert 문을 실행하여이 테이블에 8 개의 행을 삽입하겠습니다.
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)
이제 다른 쿼리를 사용하여 위의 테이블에서 세 번째로 높은 Basic_sal을 찾습니다. 관리 스튜디오에서 아래 쿼리를 실행했으며 결과는 다음과 같습니다.
select * from Employee order by Basic_Sal desc
위의 이미지에서 세 번째로 높은 기본 급여가 8500이되는 것을 볼 수 있습니다. 저는 3 가지 다른 방법으로 동일한 작업을 작성하고 있습니다. 아래에 언급 된 세 가지 쿼리를 모두 실행하면 동일한 결과, 즉 8500을 얻을 수 있습니다.
첫 번째 방법 :-행 번호 기능 사용
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 distinct salary from employee order by salary desc limit nth, 1;
http://www.mysqltutorial.org/mysql-limit.aspx에서 제한 구문을 참조하십시오 .
테이블에서 세 번째로 높은 값을 얻으려면
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
하위 쿼리 별 :
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
이 쿼리 시도
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
n = 원하는 값을 입력하십시오.
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
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);
n을 숫자로 n 번째로 높은 급여로 바꿉니다.