Oracle SQL 从一组中查找前 N 行
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 |
+-----+----------+----+------+
将是table。
我试过使用子查询,然后在 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;
最好使用 window 函数来完成:
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
我正在尝试查询前 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 |
+-----+----------+----+------+
将是table。
我试过使用子查询,然后在 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;
最好使用 window 函数来完成:
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