Customer表和Acct表具有全局范围,它们共享并增加该值
下面是客户表,SEQ NO 1是客户数据的开头,SEQ_NO 238是另一个客户数据的开头
[另一个是帐户表,所有在客户边界内具有SEQ_NO的帐户都将获得相同的组(我想将这些帐户分组到同一客户,以便我可以使用listAgg来连接帐户ID。),例如,从下面开始SEQ_NO 2和NO 224(含)应分配给同一组。
有没有一种SQL方法可以做到这一点,我想到的最坏的情况是定义oracle类型,并使用函数来做到这一点。
感谢您的任何帮助。
如果我正确理解了您的问题,您希望能够将客户表中的行分配给groups,每个客户一个,以便您可以基于这些组进行汇总。
因此,问题是如何根据第一张表(“客户”)中给出的顺序边界和第二张表(“ account”)中的特定帐号来识别每个帐户属于哪个客户。
这可以在普通SQL中完成,并且相对容易。您需要在accounts表和基于customers表的子查询之间进行联接。子查询必须显示分配给每个客户端的第一个和最后一个序列号;为此,您可以使用lead
分析功能。必须谨慎对待最后一个客户,该客户的序列号没有上限。
您没有以可用的格式提供测试数据,因此我在下面的with
子句中创建了示例数据(这不是查询的一部分-只是作为测试数据的占位符而存在。]]
with customer (cust_id, seq_no) as ( select 101, 1 from dual union all select 102, 34 from dual union all select 200, 58 from dual union all select 130, 90 from dual ) , account (acct_id, seq_no) as ( select 1003, 3 from dual union all select 1005, 11 from dual union all select 1007, 33 from dual union all select 1008, 60 from dual union all select 1103, 77 from dual union all select 1140, 92 from dual union all select 1145, 99 from dual ) select c.cust_id, listagg(a.acct_id, ',') within group (order by a.acct_id) as acct_list from ( select cust_id, seq_no as lower_no, lead(seq_no) over (order by seq_no) - 1 as upper_no from customer ) c left outer join account a on a.seq_no between c.lower_no and nvl(c.upper_no, a.seq_no) group by c.cust_id order by c.cust_id ;
输出
CUST_ID ACCT_LIST
------- --------------------
101 1003,1005,1007
102
130 1140,1145
200 1008,1103