Oracle SQL : How to SELECT N records for each "group"/ "cluster"

标签 oracle

我有一张 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 的。

IE。
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 的记录。

关于Oracle SQL : How to SELECT N records for each "group"/ "cluster",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6685899/

相关文章:

database - 为什么where子句中无用的语句会降低sql查询速度?

database - Liquibase VARCHAR2 字符长度

java - 执行大量插入

sql - 记录之间的时间差

java - Java中如何检查表中是否存在某个值?

SQL只获取带有前导数字的字符串

java - 如何通过批处理脚本下载JRE包

mysql - 直接访问数据库的开发人员工具

oracle - ORA-01031: 通过 dblink 插入时权限不足

oracle - 无法在表空间 TEMP 中将临时段扩展 128