获取顶级结果各组(在Oracle)(Get top results for each group (

2019-06-21 06:44发布

我将如何能够得到N个结果了几组的Oracle查询。

例如,如下表:

|--------+------------+------------|
| emp_id | name       | occupation |
|--------+------------+------------|
|      1 | John Smith | Accountant |
|      2 | Jane Doe   | Engineer   |
|      3 | Jack Black | Funnyman   |
|--------+------------+------------|

还有更多的行与更多的职业。 我想从每个职业获得三名员工(可以说)。

有没有办法做到这一点,而不使用子查询?

Answer 1:

这将产生你想要什么,并使用像TOP N或排名没有供应商特定的SQL功能()。

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。 您可以更改不平等比较中使用的属性,使其按名称,或任何给优秀员工。



Answer 2:

我没有一个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



Answer 3:

添加ROWNUM来排名:

select * from 
         (select emp_id, name, occupation,rank() over ( partition by occupation order by emp_id,RowNum) rank   
                      from employee) 
         where rank <= 3 


Answer 4:

在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 BY,以满足您的需求



Answer 5:

我不知道这是非常有效的,但也许一个起点?

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名不同的员工都在同一个职业行。 不幸的是,它会给你这些的所有组合。

任何人都可以削减下来吗?



文章来源: Get top results for each group (in Oracle)