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

时间:2014-05-06 19:18:50

标签: sql oracle-sqldeveloper

我的头衔可能不太清楚;希望我能在这里更有意义。

我正在使用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万人进行合作。

1 个答案:

答案 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;

您还可以使用rankdense_rank。通常,您在窗口中使用order by子句。没有你回来的行是非确定性的,你想要的(虽然你可能会多次运行查询得到相同的结果)但是如果你想要一个更随机的样本,那么你可以通过一个随机值:

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