[英]OracleSQL Finding top N rows from a group
我正在尝试查询行的前N个,但是在OracleSQL里面有一个行
例如:
+-----+----------+----+------+
|JobID|JobTitle |Pay |Name |
+-----+----------+----+------+
|012 |Manager |400 |Bob |
|012 |Manager |400 |Gemma |
|012 |Manager |400 |Ash |
|020 |Supervisor|400 |Dan |
|020 |Supervisor|400 |Hannah|
|013 |Clerk |300 |Sarah |
+-----+----------+----+------+
从上面的示例中,我想找到一个职位名称下的所有雇员,然后仅显示收入最高的3个工作,然后按薪水排序。
+-----+----------+----+------+
|JobID|JobTitle |Pay |Name |
+-----+----------+----+------+
|02 |Manager |400 |Bob |
|02 |Manager |400 |Gemma |
|02 |Manager |400 |Ash |
|04 |Supervisor|400 |Dan |
|04 |Supervisor|400 |Hannah|
|03 |Clerk |300 |Sarah |
|01 |Cleaner |200 |Scruff|
|01 |Cleaner |200 |Fry |
+-----+----------+----+------+
会是桌子。
我试过使用子查询,然后添加rownum <= 3; 最后,但仍然没有找到想要的结果。
SELECT * FROM
( SELECT JobID, MAX(Pay) AS Pay, JobTitle, EmpID, Name
FROM Employees,Jobs
WHERE JobID = Employees.Job_ID
GROUP BY JobID, Pay, EmpID, JobTitle,
ORDER BY Pay DESC)
WHERE ROWNUM <= 3;
最好使用窗口函数完成此操作:
select jobid, jobtitle, pay, name
from (
select j.jobid, j.jobtitle, e.pay, e.name,
row_number() over (partition by j.jobid order by e.pay desc) as rn
from employees e
join jobs j on j.jobid = e.job_id
)
where rn <= 3
order by jobid, jobtitle, pay desc;
我还将where子句中过时的隐式联接更改为显式JOIN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.