我的头衔可能不太清楚;希望我能在这里更有意义。
我正在使用Oracle DB。
我有一张名为EMPLOYEES的表
表格中有一个名为DIVISION
的表格每个员工都属于某个部门。
我想选择每个部门的前5名员工。
例如,如果我的表格如下:
EMPLOYEE_NO | DIVISION
----------------------
Mike | 1
John | 1
Peter | 3
Paul | 2
Mary | 1
Joanne | 2
Kristine | 3
Adam | 1
Brian | 3
Joel | 3
Amy | 2
Ben | 2
Ryan | 1
我希望能够查询该表并从每个部门获得3名员工。所以我的结果将是:
EMPLOYEE_NO | DIVISION
----------------------
Mike | 1
John | 1
Mary | 1
Joanne | 2
Amy | 2
Ben | 2
Kristine | 3
Brian | 3
Joel | 3
我不在乎它是否是前三个成员,或者它是否是最后三个成员,或者它是否是随机选择的3.我基本上想要一个样本每个部门的员工。
我发现了一个类似的问题:How to select the first N rows of each group?
但我担心的是,这个解决方案是否适合拥有数百万条记录的数据库。我正在与大约300万人进行合作。
答案 0 :(得分:1)
您可以在子查询中使用分析函数:
select employee_no, division
from (
select employee_no, division,
row_number() over (partition by division) as rn
)
where rn <= 3
order by division, employee_no;
您还可以使用rank
或dense_rank
。通常,您在窗口中使用order by
子句。没有你回来的行是非确定性的,你想要的(虽然你可能会多次运行查询得到相同的结果)但是如果你想要一个更随机的样本,那么你可以通过一个随机值:
row_number() over (partition by division order by dbms_random.value) as rn