基于参考表中的值的ORACLE SQL组

问题描述 投票:0回答:1

Customer表和Acct表具有全局范围,它们共享并增加该值

下面是客户表,SEQ NO 1是客户数据的开头,SEQ_NO 238是另一个客户数据的开头

enter image description here

[另一个是帐户表,所有在客户边界内具有SEQ_NO的帐户都将获得相同的组(我想将这些帐户分组到同一客户,以便我可以使用listAgg来连接帐户ID。),例如,从下面开始SEQ_NO 2和NO 224(含)应分配给同一组。

enter image description here

有没有一种SQL方法可以做到这一点,我想到的最坏的情况是定义oracle类型,并使用函数来做到这一点。

感谢您的任何帮助。

sql oracle datatables reference rank
1个回答
0
投票

如果我正确理解了您的问题,您希望能够将客户表中的行分配给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 
© www.soinside.com 2019 - 2024. All rights reserved.