我怎样才能获得几个团体的N个结果 一个oracle查询。
例如,给出下表:
|--------+------------+------------|
| emp_id | name | occupation |
|--------+------------+------------|
| 1 | John Smith | Accountant |
| 2 | Jane Doe | Engineer |
| 3 | Jack Black | Funnyman |
|--------+------------+------------|
还有更多行占用更多。我想得到 每个职业的三名员工(比如说)。
有没有办法在不使用子查询的情况下执行此操作?
答案 0 :(得分:34)
我现在没有方便的oracle实例,所以我没有测试过这个:
select *
from (select emp_id, name, occupation,
rank() over ( partition by occupation order by emp_id) rank
from employee)
where rank <= 3
以下是有关排名如何运作的链接:http://www.psoug.org/reference/rank.html
答案 1 :(得分: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;
在此示例中,它为三名员工提供每个职业的最低emp_id值。您可以更改不等式比较中使用的属性,使其按名称或其他方式为顶级员工提供。
答案 2 :(得分:2)
将RowNum添加到排名:
select * from
(select emp_id, name, occupation,rank() over ( partition by occupation order by emp_id,RowNum) rank
from employee)
where rank <= 3
答案 3 :(得分:1)
我不确定这是非常有效的,但也许是一个起点?
select *
from people p1
join people p2
on p1.occupation = p2.occupation
join people p3
on p1.occupation = p3.occupation
and p2.occupation = p3.occupation
where p1.emp_id != p2.emp_id
and p1.emp_id != p3.emp_id
这应该为您提供包含3个不同员工的行,这些员工都在同一职业中。不幸的是,它会为你提供所有这些组合。
任何人都可以拒绝吗?
答案 4 :(得分:1)
在SQL Server中测试了它(它使用子查询)
select emp_id, name, occupation
from employees t1
where emp_id IN (select top 3 emp_id from employees t2 where t2.occupation = t1.occupation)
只需在子查询中执行ORDER以满足您的需求