暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将记录拆分为N行的组

ASKTOM 2020-09-23
561

问题描述

从具有100,000记录的表中获得一个SQL,一个特定的varchar2字段包含诸如 “12345”,“56789”,“1111” 之类的字符串。
我想用适当的逗号创建一个带有拆分/分块的表

在实时链接中的示例 ::: 在组 (按id排序) 中选择listagg(id,',') 从 (从ad.AD_STUDENT_COURSE_DETAILS中选择course_id作为id)

示例:: 100条记录每条记录具有以下id

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99


现在假设基于上述结果集,我应该能够根据自己的定义使我的序列动态并将一组记录插入逗号分隔值 (listagg) 中

如果我给22它应该得到的值,并分布到4块和剩余的左基于选择查询结果,并使相应的块的序列。在这个例子中,我的select查询中的99条记录已加载到具有5条记录 (5个序列号) 的新表中,每条记录携带22条记录,其余记录。

新表

seq_number list_of_ids
1           1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
2           23,2425,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44
3           45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66
4           67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88
5           89,90,91,92,93,94,95,96,97,98,99


是否可以在SQL查询中实现与上述格式或PL/SQL块的结果相同的结果?

感谢你的帮助。

专家解答

要将行拆分为每组中有N行的组:

-将row_number() 分配给表 (如果还没有) 从1开始的顺序行号
-将这个行号除以N,返回它的ceil
-按此表达式分组:

with rws as (
  select level rn from dual
  connect by level <= 100
), grps as (
  select r.*, 
         ceil ( rn / 22 ) grp
  from   rws r
)
  select grp, 
         listagg ( rn, ',' ) 
           within group ( 
             order by rn 
           ) vals
  from   grps
  group  by grp;
  
GRP    VALS                                                                
     1 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22             
     2 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44    
     3 45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66    
     4 67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88    
     5 89,90,91,92,93,94,95,96,97,98,99,100 

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论