2010-03-22 3 views

답변

0

이 시도 :

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

-1 나는 이것이 무엇을 돌려 줄지는 모르겠지만 아마도 그 질문이 무엇인지에 대해서는 확신 할 수 없다 :-) –

+0

"method"와 무엇을 의미 하느냐에 달려있다. 나를 위해 방법은 결과를 얻는 과정입니다; 그리고 이것은 내 제안 된 방법입니다. 내 첫 번째 downvote 감사합니다 :). – systempuntoout

+3

@Aaron : 아마도 결과를 반환하는 가장 효과적인 방법은 아니지만 (자체 조인을 사용하기 때문에) 정확한 답변을 반환합니다. * 급여를 제공하는 것은 고유합니다. * (세 사람이있는 경우 예를 들어 작동하지 않습니다. 동일한 최고 봉급으로). –

2

오라클에서 당신은 (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 
5

오라클의 분석 기능을 사용하는 방법입니다. 특정 시나리오는 another thread에서 제공 한 솔루션의 변형입니다. 추가 정보를 선택하려면, 그러나

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> 

: 당신은 그냥 다음 DENSE_RANK(), RANK()와 ROW_NUMBER (중 하나를 두 번째로 높은 연봉을 선택에 관심이 있다면

)는 트릭을 할 것입니다 , 두 번째로 높은 급여를 가진 직원의 이름과 같이, 선택한 기능이 결과에 영향을 미칩니다. 하나를 선택하는 주된 이유는 동점이있을 때 일어나는 일입니다.

ROW_NUMBER()를 사용하면 급여로 주문 된 두 번째 직원이 반환됩니다. 가장 높은 급여를받는 직원이 두 명인 경우 어떻게해야합니까? 두 번째로 높은 급여를받는 직원이 두 명이라면 어떻게해야합니까? 당신은 RANK()를 사용하고 첫번째 가장 높은 급여에 대한 묶는 두 명의 직원이있는 경우 Wheareas, RANK와 기록 = 내가 DENSE_RANK을 (제안 2.

) 이러한 경우에 선택할 수있는 일반적으로 가장 안전한 기능이있을 것 하지만 실제로는 특정 비즈니스 요구 사항에 따라 다릅니다. 이 표에서 n은 가장 높은 급여를 찾으려면

1

, 당신은이를 사용할 수 있습니다

select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n; 

는 1,2,3, ..., n은

그것은이다 n이된다 테이블에서 최대 봉급을 알아내는 매우 쉬운 과정.

관련 문제