Oracle SQL:如何为每个“组”/“集群”选择N条记录

时间:2011-07-13 21:26:31

标签: oracle

我有一张表 big_table ,有400万条记录,它们通过一个名为“ process_type_cod ”的列聚集在40个组中。此列可能采用的值列表位于第二个表中。我们称之为 small_table

因此,我们将big_table与一个名为process_type_cod的NOT NULL FK指向small_table(假设两个表中的列名相同)。

我想要big_table的N记录(即10),small_table的每个记录

即。 来自big_table的10条记录与small_table的第一条记录有关 联盟 big_table的10条不同记录与小表的第二条记录有关,依此类推。

是否可以使用单个SQL函数获取?

1 个答案:

答案 0 :(得分:10)

我推荐使用rank()或row_number()等分析函数。您可以使用硬编码的联合执行此操作,但分析功能可以为您完成所有艰苦的工作。

select *
from 
(
    select
      bt.col_a,
      bt.col_b,
      bt.process_type_cod,
      row_number() over ( partition by process_type_cod order by col_a nulls last ) rank
    from small_table st
    inner join big_table bt
      on st.process_type_cod = bt.process_type_cod
)
where rank < 11
;

您可能甚至不需要加入,因为big_table具有您关注的所有类型。在这种情况下,只需将'from子句'更改为使用big_table并删除连接。

这样做是执行查询,然后使用partition语句中的'order by'运算符对记录进行排序。对于给定的组(这里我们按col_a分组),数字行号(即1,2,3,4,5,n + 1 ......)连续地应用于每个记录。在外部where子句中,只需按低于N的记录进行过滤。