我有一个表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的数字进行过滤.