[英]ORACLE sql query for getting top 3 salaries rownum greater than
我想寫一個查詢以顯示獲得前三名薪水的員工
SELECT *
FROM (SELECT salary, first_name
FROM employees
ORDER BY salary desc)
WHERE rownum <= 3;
但是我不明白如何為嵌套查詢計算該rownum是否可以正常工作,或者如果遇到問題,請您讓我理解:
SELECT *
FROM (SELECT salary, first_name
FROM employees
ORDER BY salary )
WHERE rownum >= 3;
我通過了Oracle / SQL鏈接:為什么查詢“ SELECT * FROM records where rownum> = 5 AND rownum <= 10”-返回零行 ,但它再次指向鏈接,但沒有給出答案
a_horse_with_no_name的答案很不錯,
但是只是為了讓您理解為什么您是第一個查詢而第二個卻不行:
當您使用子查詢時,Oracle不會神奇地使用子查詢的rownum,它只會獲取有序的數據,因此它會相應地提供rownum,符合條件的第一行仍將獲得rownum 1,依此類推。 這就是為什么第二個查詢仍然不返回任何行的原因。
如果要限制起始行,則需要保留子查詢的rownum,即:
SELECT *
FROM (SELECT * , rownum rn
FROM (SELECT salary, first_name
FROM employees
ORDER BY salary ) )sq
WHERE sq.rn >= 3;
但是正如a_horse_with_no_name所說,還有更好的選擇...
編輯:為了使事情更清楚,請看以下查詢:
with t as (
select 'a' aa, 4 sal from dual
union all
select 'b' aa, 1 sal from dual
union all
select 'c' aa, 5 sal from dual
union all
select 'd' aa, 3 sal from dual
union all
select 'e' aa, 2 sal from dual
order by aa
)
select sub.*, rownum main_rn
from (select t.*, rownum sub_rn from t order by sal) sub
where rownum < 4
請注意子行和主行之間的區別,請參閱哪一個用於標准
查詢的“行編號” 在將order by應用於結果之前已分配。 因此,行編號42可能會成為第一行。
一般來說,您需要使用內部查詢中的rownum來限制整體輸出。 手冊對此進行了很好的解釋:
http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns009.htm#i1006297
我更喜歡使用row_number(),因為您可以更好地控制排序,並且它是可在大多數現代DBMS上使用的標准功能:
SELECT *
FROM (
SELECT salary,
first_name,
row_number() over (order by salary) as rn
FROM employees
)
WHERE rn <= 3
ORDER BY salary;
您應該理解,在這種情況下,派生表僅是必需的,以便能夠對生成的rn
列應用條件。 不能避免“行數問題”,因為row_number()
的值僅取決於over(...)
部分中指定的順序(它獨立於應用於查詢本身的任何順序)
請注意,這將不會返回具有相同薪水但仍屬於前三名的員工。 在這種情況下,使用dense_rank()
可能更合適。
如果您想選擇薪水最高的3個人。也許您應該考慮使用分析工具。
SELECT *
FROM (
SELECT salary, first_name, dense_rank() over(order by salary desc) sal_rank
FROM employees
)
WHERE sal_rank <= 3
即所有薪水金額排名第三(或更高)的人
與使用普通rownum相比,此方法的優勢在於,如果您有多個薪水相同的人,他們將全部返回。
最簡單的打印第五高薪水的方法。
SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 5
根據相同的方法,如果您想打印第三或第四高薪,則只需更改最后一個值即可。(平均值代替5使用3或4,您將獲得第三或第四高薪)。
SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 4
SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 3
SELECT EMPNO,SAL(從E.EMPNO <= T.EMPNO的測試中選擇SUM(E.SAL),R_SAL FROM(SELECT EMPNO,EMPNO的測試訂單中的SAL)T
返回所有字段詳細信息的最容易找到oracle前3名員工的方法:
SELECT *
FROM (
SELECT * FROM emp
ORDER BY sal DESC)
WHERE rownum <= 3 ;
select *
from (
select emp.*,
row_number() over(order by sal desc)r
from emp
)
where r <= 3;
SELECT Max(Salary)
FROM Employee
WHERE Salary < (SELECT Max(salary) FROM employee WHERE Salary NOT IN (SELECT max(salary) FROM employee))
ORDER BY salary DESC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.