gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:50:34 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com