加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-04-02 10:41:16 所属栏目:站长百科 来源:网络整理
导读:我有一个表big_table,有400万条记录,它们通过名为“process_type_cod”的列聚集在40组中.此列可能采用的值列表位于第二个表中.我们称之为small_table. 因此,我们将big_table与一个名为process_type_cod的NOT NULL FK指向small_table(假设两个表上的列名相同)

我有一个表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函数获取?

解决方法

我推荐一个分析函数,如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并删除连接.

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

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读