繁体   English   中英

SQL-如何根据行值选择前n行

[英]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;

您还可以使用rankdense_rank 通常,您会在窗口中使用order by子句。 如果没有,则返回的行是不确定的,尽管您想要的行不确定(尽管您可能会通过多次运行查询获得相同的结果),但是如果您想要一个更随机的样本,则可以按随机值排序:

  row_number() over (partition by division order by dbms_random.value) as rn

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM