我有一张表 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函数获取?
答案 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的记录进行过滤。