2017-11-09 6 views
-2

マイemp表:SQLクエリ会社でトップ5所得者を見つけるために(オラクルDB)

ENAME    SAL 
---------- ---------- 
KING    5000 
SCOTT   3000 
FORD    3000 
JONES   2975 
BLAKE   2850 
CLARK   2450 

トップ5 earners.iを取得するためには、以下のクエリを使用していました。

SELECT * 
FROM (SELECT ename, sal 
    from emp 
    ORDER BY sal desc) 
WHERE rownum <= 5 
order by sal desc; 

が、私はこのような出力を取得しています:このリストで

ENAME    SAL 
---------- ---------- 
KING    5000 
SCOTT   3000 
FORD    3000 
JONES   2975 
BLAKE   2850 

、 'CLARKが' 不足しています。

従業員のCLARKもトップ5に入っています。リストに同じ給与がある場合、私は取得しますか? dense_rankを使用すると、リストに「CLARK」が表示されます。

SELECT * from 
(SELECT ename,SAL,DENSE_RANK() OVER(ORDER BY SAL DESC) AS RK FROM EMP) 
WHERE RK <= 5 
ORDER BY SAL DESC; 



ENAME    SAL   RK 
---------- ---------- ---------- 
KING    5000   1 
SCOTT   3000   2 
FORD    3000   2 
JONES   2975   3 
BLAKE   2850   4 
CLARK   2450   5 
+2

は、私はあなたの出力が正しいことだと思います。 CLARKは、6番目に高い給与従業員です。何の出力が期待されている、質問に言及。 – Siraj

+1

あなたはトップ5を求めていますが、あなたは5を持っています。トップ5の通常の定義にはCLARKは含まれていません(CLARKは5位タイの一部ではないためです)。そしてなぜ 'dense_rank'を使いたいのですか? – Richard

+0

5番目の位置に結び付いているとすれば? – sri

答えて

0

これはSQL SERVERクエリです。

SELECT ename, sal 
from emp 
ORDER BY sal desc 
fetch first 5 rows with ties 

除くネクタイ:ネクタイを含め

SELECT Ename, Sal 
    FROM emp 
    WHERE sal IN(
     SELECT TOP 5 sal 
     FROM @emp GROUP BY sal 
     ORDER by sal DESC) 
+0

OPは彼が 'DENSE_RANK'を使いたくないと言います – dbajtr

0

SELECT Ename, Sal 
    FROM  
     (
     SELECT ename, sal,DENSE_RANK() OVER(ORDER BY Sal DESC)RN from emp ORDER BY sal desc 
     )D 
    WHERE RN <= 5 
    ORDER BY sal desc; 

DENSE_RANKなしでは、この回答を試してみてください、それはあなたのお役に立てば幸いです

... fetch first 5 rows only 

ANSI SQL、サポートより新しいOracle Versio ns。 (それは10グラムである場合、私は知りません。)

0

は内側のSELECTでトップ5の給与を決定します。

select e.ename, e.sal 
    from emp e 
where e.sal in 
     (select ee.sal 
      from emp ee 
     group by ee.sal 
     order by ee.sal desc fetch first 5 rows only) -- top 5 salaries 
order by e.sal desc, e.ename asc; 
関連する問題