복붙노트

[SQL] 어떻게 두 번째로 높은 급여와 직원을 찾는 방법은?

SQL

어떻게 두 번째로 높은 급여와 직원을 찾는 방법은?

미리 정의 된 함수 나 방법은 직원 테이블에서 두 번째로 높은 급여를 얻을 사용할 수 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.이 시도:

    이 시도:

    SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE
    salary >= emp.salary);
    
  5. ==============================

    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
    

    데모

  6. from https://stackoverflow.com/questions/2491063/how-to-find-the-employee-with-the-second-highest-salary by cc-by-sa and MIT license