급여 테이블에서 세 번째 또는 n 번째 최대 급여를 찾는 방법은 무엇입니까?


답변:


82

사용 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

테이블에서 최저 급여 기록을 얻는 방법? ins.KYS_ID, ins.FKYS_INS_ID from cmn_pat_x_insurance ins where ins.FKYS_PAT_ID = '1253_717'and ins.FKYS_INS_TYPE in (1) and ins.BOL_TYPE in (1,3) and ins.salary in (min (ins.salary))
saidesh kilaru

직원 테이블에 10,0000 개의 레코드가 있다고 상상해보십시오. 위의 쿼리를 사용하면 성능이 6 ~ 10 배 저하됩니다.
Bimal Das

1
@BimalDas : 그러면 EmpSalary열에 인덱스가 없습니다 . 또한 무엇에 비해 감소? ROW_NUMBER접근 방식 의 장점은 ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). 따라서 그룹을 가져 오는 데 사용할 수 있지만 여전히 모든 열에 액세스 할 수 있습니다.
Tim Schmelter 2017

@TimSchmelter WITH CTE는 첫 번째 SELECT 문의 전체 데이터를 저장하는 임시 테이블을 만든 다음 결과에서 "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow"를 선택합니다. 그래서 조금 느리다고 생각합니다. 확인했습니다. 또한 적절한 인덱싱이 있습니다.
Bimal Das

2
@BimalDas : 아니요, 임시 테이블을 만드는 것이 아닙니다. 일반적으로 cte는 어디에도 구체화되지 않습니다. 인라인보기 또는 명명 된 하위 쿼리와 비슷합니다.
Tim Schmelter 2017

88

행 번호 :

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

테이블에서 최저 급여 기록을 얻는 방법? ins.KYS_ID, ins.FKYS_INS_ID from cmn_pat_x_insurance ins where ins.FKYS_PAT_ID = '1253_717'and ins.FKYS_INS_TYPE in (1) and ins.BOL_TYPE in (1,3) and ins.salary in (min (ins.salary))
saidesh kilaru

Kumar와 Alexander, 필드를 하나 더 얻고 싶습니다. 어떻게해야합니까? 내 쿼리는 "" "Select Top 1 NoteID From (Select DateDiff (Year, SchedualDate, Current_TimeStamp) as NoteAge, Distinct Top 3 NoteID From [dbo]. [DocSecheduale] Order by NoteID Desc) a Order by NoteID" ""
Zaveed 아바

당신은 하위 쿼리 ... 설명하고자, 나는 n 번째 높은 연봉을 찾는거야하지만 난 하위 쿼리를 이해하는 복잡성을 얻고있다
디팍 굽타

@deepak_java 하위 쿼리는 외부 쿼리에 의해 행이 처리 될 때마다 평가됩니다. 즉, 내부 쿼리도 Emp1 값을 사용하므로 내부 쿼리는 외부 쿼리와 독립적으로 처리 할 수 ​​없습니다.
Kumar Manish 2015 년

... 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이므로이 행이 반환됩니다.
jerrymouse

65

이 시도

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

3의 경우 모든 값을 바꿀 수 있습니다.


이것은 오라클 10g 또는 11g에서 작동합니까? 아니면 이렇게 예쁜 대안이 있습니까?
RBz

40

최적화 방법을 원한다면 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)

가장 간단하고 기억하기 쉽습니다. +1
Sнаđошƒаӽ

4
왜 우리가 ASC 순서로하고 있는지 최대 급여를 얻으려면 DESC 순서로 수행해야합니다. 급여가 7000,10000,11000,500,800,900,12000과 같은 경우 정렬의 내부 쿼리는 500,800,900을 의미하는 top3이됩니다. 그리고 이것들의 최대는 900이지만 900은 최대 3이 아닙니다. 3 최대 급여는 10000입니다.
Narendra Jaggi

1
예 : 최대 급여 3 개 : 다음과 같아야합니다. SELECT Min (EmpSalary) FROM Salary WHERE EmpSalary IN (Salary ORDER BY EmpSalary DESC에서 TOP 3 EmpSalary 선택)
Jimit Rupani 2018 년

15

하위 쿼리를 사용하면 너무 간단합니다!

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 명령을 사용하여 최소 급여를 선택합니다.


이 오류가 발생합니다. 오류 코드 : 1248 모든 테이블이 자신의 별명을 가지고 있어야 유도

별칭을 추가합니다. SELECT MIN (EmpSalary) from (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) as s;
anonxss

중복을 방지하려면 DISTINCT를 사용하십시오. SELECT MIN (EmpSalary) from (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh

14

N을 최대 숫자로 바꿉니다.

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

설명

위의 쿼리는 이전에 이와 같은 것을 본 적이없는 경우 매우 혼란 스러울 수 있습니다. 내부 쿼리 (서브 쿼리)는 외부 쿼리 (이 경우 Emp1 테이블)의 값을 사용하기 때문에 내부 쿼리는 상관 하위 쿼리라고합니다. ) WHERE 절입니다.

그리고 소스


+1 왜 ... 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이므로이 행이 반환됩니다.
jerrymouse

13

하위 쿼리를 사용하지 않고 급여 테이블의 세 번째 또는 n 번째 최대 급여

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

세 번째로 높은 급여의 경우 N-1 대신 2를 입력합니다.


3
OFFSET FETCH는 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
DENSE_RANK 주셔서 감사합니다 () 나는 그것을 들어 본 적이없는
Vivekh

8

n 번째로 높은 급여를 받으려면 다음 쿼리를 참조하십시오. 이렇게하면 MYSQL에서 n 번째로 높은 급여를받습니다. n 번째로 낮은 급여를 받으려면 쿼리에서 DESC를 ASC로 바꾸면됩니다. n 번째로 높은 연봉


1
문제는 MySQL이 아닌 SQL-Server에 관한 것입니다.
bummi 2014


6

방법 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

방법 1 정렬 할 수 있습니다 : SELECT TOP 1 SALARY * (직원 FROM SELECT TOP 3 SALARY) FROM을 합리적인 때문에 기본은 오름차순으로
인 Ashish 아그라 왈 Yodlee

5

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 ()를 사용하여보다 직관적으로 수행됩니다.



3

이것은 모든 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

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;

세 번째로 높은 연봉을 보이고 있습니다


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

3

--n 번째로 높은 급여

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

-(n 번째 -1) 최고 급여

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



2

하위 쿼리 별 :

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

1

이 쿼리 시도

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

n = 원하는 값을 입력하십시오.



1

MySQL 테스트 솔루션, N = 4라고 가정합니다.

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

다른 예시:

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

1

이 코드를 시도하십시오 :-

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);

n을 숫자로 n 번째로 높은 급여로 바꿉니다.


0

이거 한번 해봐...

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;

두 번째로 높은 급여의 경우 위 쿼리에서 3을 2로 변경하고 N 번째로 높은 급여의 경우 N을 N으로 변경합니다. 여기서 N = 1,2,3,4 ....


0

SELECT * FROM (연봉 DESC에 따라 고객 주문에서 고유 한 급여 선택) 한도 4,1;

Limit 4,1은 처음 4 개 행을 남겨두고 다음 행을 선택하는 것을 의미합니다.

제한 및 행 번호는 사용중인 플랫폼에 따라 다릅니다.

이것을 시도하면 작동합니다.


0

참고 : 쿼리의 OFFSET 3 을 N 번째 정수로 바꾸십시오.

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

기술

다음 1 행만 가져 오기

1 행만 반환

오프셋 3 행

처음 3 개 레코드 제외 여기에 정수를 입력 할 수 있습니다.


0

하위 쿼리에는 항상 더 많은 시간이 걸립니다.

가장 높은 데이터와 가장 낮은 데이터를 얻으려면 아래 쿼리를 사용하십시오.

최고 데이터 : select *from business order by id desc limit 3,1;

최저 데이터 : select *from business order by id asc limit 3,1;

n 번째 데이터를 얻기 위해 3 대신 N을 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.