[英]SQL - How to select first n rows based on row values
我的头衔可能不太清楚; 希望我可以在这里更有意义。
我正在使用Oracle数据库。
我有一个叫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名成员,还是后3名成员,还是3个成员的随机选择。本质上,我想从每个部门中抽取员工样本。
我已经发现了一个类似的问题: 如何选择每个组的前N行?
但是我担心的是,这种解决方案是否不适用于具有数百万条记录的数据库。 我正在处理大约300万个录音笔。
您可以在子查询中使用解析函数:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.