[SQL] 어떻게 두 번째로 높은 급여와 직원을 찾는 방법은?
SQL어떻게 두 번째로 높은 급여와 직원을 찾는 방법은?
미리 정의 된 함수 나 방법은 직원 테이블에서 두 번째로 높은 급여를 얻을 사용할 수 있습니까?
해결법
-
==============================
1.이 작업을 수행하는 방법은 오라클의 분석 기능입니다. 귀하의 특정 시나리오는 내가 다른 스레드에서 제공하는 솔루션에 불과 변종이다.
이 작업을 수행하는 방법은 오라클의 분석 기능입니다. 귀하의 특정 시나리오는 내가 다른 스레드에서 제공하는 솔루션에 불과 변종이다.
그냥 다음 어떤 DENSE_RANK (), RANK ()와 ROW_NUMBER (의 두 번째로 높은 연봉을 선택에 관심이 있다면) 트릭을 할 것입니다 :
SQL> select * from 2 ( select sal 3 , rank() over (order by sal desc) as rnk 4 from 5 ( select distinct sal 6 from emp ) 7 ) 8 where rnk = 2 9 / SAL RNK ---------- ---------- 3000 2 SQL>
당신은 두 번째로 높은 급여와 직원의 이름과 같은 추가 정보를 선택하려는 경우, 당신이 선택하는 기능은 결과에 영향을 미칠 것입니다. 다른 통해 하나를 선택하는 가장 큰 이유는 넥타이가 때 발생하는 것입니다.
당신이 ROW_NUMBER를 사용하는 경우 ()는 급여의 지시 두 번째 직원을 반환합니다 : 가장 높은 급여에 대한 묶는 두 직원이 어떤 경우에? 어떤 두 번째로 높은 급여에 대한 묶는 두 직원이 있다면? 당신은 RANK를 (사용) 먼저 가장 높은 급여에 대한 묶는 두 명의 직원이있는 경우 Wheareas, RANK = 2 레코드가 없을 것이다.
나는 DENSE_RANK ()가 이러한 경우에 선택할 수있는 일반적으로 가장 안전한 기능입니다 제안,하지만 정말 특정 비즈니스 요구 사항에 따라 달라집니다 않습니다.
-
==============================
2.오라클에서는 같은 페이지 된 결과 (행 N에 M)을 반환이 하나로 쿼리를 사용합니다 :
오라클에서는 같은 페이지 된 결과 (행 N에 M)을 반환이 하나로 쿼리를 사용합니다 :
SELECT NAME, salary FROM (SELECT NAME, salary, ROWNUM r FROM (SELECT NAME, salary FROM employee ORDER BY salary DESC ) WHERE ROWNUM <= :N ) WHERE r >= :M
다른 방법으로는 분석을 사용할 수 있습니다 :
SELECT NAME, salary FROM (SELECT NAME, salary, row_number() over (ORDER BY salary DESC) n FROM employee) WHERE n BETWEEN :M AND :N
-
==============================
3.이 표에서 n은 가장 높은 급여를 찾으려면, 당신은이를 사용할 수 있습니다 :
이 표에서 n은 가장 높은 급여를 찾으려면, 당신은이를 사용할 수 있습니다 :
select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n;
여기서, n은 1,2,3, ..., N
이 표에서 최대 급여를 발견하는 아주 쉬운 과정이다.
-
==============================
4.이 시도:
이 시도:
SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE salary >= emp.salary);
-
==============================
5.이 같은 구문을 도입 오라클 DB의 12C와 최고-N 쿼리를 처리하기 쉽습니다 :
이 같은 구문을 도입 오라클 DB의 12C와 최고-N 쿼리를 처리하기 쉽습니다 :
[ OFFSET offset { ROW | ROWS } ] [ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ] { ROW | ROWS } { ONLY | WITH TIES } ]
ORDER BY 목록 후 쿼리에 사용합니다.
이 경우 사용을 고려 :
select * from emp order by sal desc offset 1 rows fetch next 1 rows only
오프셋 사용하는 경우, 선택적으로 이미 구문에서 본 및 인출 조항의 시작 지점 종료 지점은 + 1 오프셋됩니다.
특별한 경우 여러 행이 N 번째 행 (여기서 우리는 2 행을 필요로)의 값과 일치 의미 관계를 가지고있다. 상단 두 번째 위치에 대해 동일한 급여 이상의 사람들이 있다면, 우리는 그들 모두를 반환하는 관계에 의해서만 키워드를 교체해야합니다 :
select * from emp order by sal desc offset 1 rows fetch next 1 rows with ties
데모
from https://stackoverflow.com/questions/2491063/how-to-find-the-employee-with-the-second-highest-salary by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 GroupWise에 MAX ()는 예기치 않은 결과를 반환 (0) | 2020.05.29 |
---|---|
[SQL] MySQL의 빈 IN 절 매개 변수 목록 (0) | 2020.05.28 |
[SQL] SQL 문에서 사용하는 R 스크립트 문자열 변수 전달 (0) | 2020.05.28 |
[SQL] 는 SQL 트랜잭션의 동시성 처리 (0) | 2020.05.28 |
[SQL] 다중 열 외래 키 제약 조건 (0) | 2020.05.28 |