one*_*elf 12 sql oracle greatest-n-per-group
如何在oracle查询中获得几个组的N个结果.
例如,给出下表:
|--------+------------+------------|
| emp_id | name | occupation |
|--------+------------+------------|
| 1 | John Smith | Accountant |
| 2 | Jane Doe | Engineer |
| 3 | Jack Black | Funnyman |
|--------+------------+------------|
Run Code Online (Sandbox Code Playgroud)
还有更多行占用更多.我想从每个职业中找到三名员工(比方说).
有没有办法在不使用子查询的情况下执行此操作?
jop*_*jop 36
我现在没有方便的oracle实例所以我没有测试过这个:
select *
from (select emp_id, name, occupation,
rank() over ( partition by occupation order by emp_id) rank
from employee)
where rank <= 3
Run Code Online (Sandbox Code Playgroud)
以下是关于排名如何运作的链接:http://www.psoug.org/reference/rank.html
Bil*_*win 11
这产生了你想要的东西,它没有使用特定于供应商的SQL功能,如TOP N或RANK().
SELECT MAX(e.name) AS name, MAX(e.occupation) AS occupation
FROM emp e
LEFT OUTER JOIN emp e2
ON (e.occupation = e2.occupation AND e.emp_id <= e2.emp_id)
GROUP BY e.emp_id
HAVING COUNT(*) <= 3
ORDER BY occupation;
Run Code Online (Sandbox Code Playgroud)
在此示例中,它为三个员工提供每个职业的最低emp_id值.您可以更改不等式比较中使用的属性,使其按名称或其他方式为最高员工提供.