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

Oracle SQL:如何为每个“组”/“群集”选择N条记录,oracle,Oracle,我有一个大表格,有400万条记录,它们通过一个名为process\u type\u cod的列聚集在40个组中。此列可能假定的值列表位于第二个表中。我们叫它小桌子吧 因此,我们有一个名为process_type_cod的非空FK的大_表,它指向小_表,假设两个表上的列名称相同 我想要N条记录,即大表中的10条,用于小表的每条记录 即。 10来自大_表的记录与小_表的第一条记录相关 协会 10条不同于大表的记录与小表的第二条记录相关,依此类推 是否可以使用单个SQL函数获取数据?我建议使用分析函数

我有一个大表格,有400万条记录,它们通过一个名为process\u type\u cod的列聚集在40个组中。此列可能假定的值列表位于第二个表中。我们叫它小桌子吧

因此,我们有一个名为process_type_cod的非空FK的大_表,它指向小_表,假设两个表上的列名称相同

我想要N条记录,即大表中的10条,用于小表的每条记录

即。 10来自大_表的记录与小_表的第一条记录相关 协会 10条不同于大表的记录与小表的第二条记录相关,依此类推


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

我建议使用分析函数,如秩或行号。您可以使用硬编码的并集来实现这一点,但是分析函数为您完成了所有艰苦的工作

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_表具有您所关心的所有类型。在这种情况下,只需将“from子句”更改为使用big_table并删除连接即可


这样做的目的是执行查询,然后使用partition语句中的“orderby”操作符对记录进行排序。对于给定的组,我们按列a分组,一个数字行号,即1,2,3,4,5,n+1。。。连续应用于每个记录。在外部where子句中,只需按数字小于N的记录进行筛选。

您关心每条记录对应的10行吗?结果是否需要确定性?几乎不错。当col_a具有相同的值时,分析函数RANK将产生相同的数字,因此在此查询中,每个进程类型代码可以选择10行以上。在这种情况下,最好使用ROW_编号。它是否可以在大表上创建一个完整的表访问?有可能避免吗?i、 我不需要排序,是否有ORDERBYNULL子句或类似的东西?您不能避免排序,因为您试图基于类别进行聚合。如果希望避免排序,则需要为每种类型使用一组显式union语句。就完整扫描而言,它取决于索引的配置方式。运行解释计划以查看。