Если я правильно понимаю ваш вопрос, вы хотите иметь возможность назначать строки в таблице счетов для групп , по одной на каждого клиента, чтобы затем можно было агрегировать на основе этих групп.
Таким образом, вопрос заключается в том, как определить, к какому клиенту относится каждая учетная запись, на основе границ последовательности, указанных в первой таблице («клиент»), и указанных c номеров счетов во второй таблице («учетная запись»).
Это можно сделать простым SQL и относительно легко. Вам необходимо объединить таблицу счетов и подзапрос на основе таблицы клиентов. Подзапрос должен показывать первый и последний порядковый номер, выделенный каждому клиенту; Для этого вы можете использовать функцию lead
analyti c. Необходимо немного позаботиться о последнем клиенте, для которого нет верхнего предела для порядковых номеров.
Вы не предоставили тестовые данные в пригодном для использования формате, поэтому я создал образцы данных в 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
;
OUTPUT
CUST_ID ACCT_LIST
------- --------------------
101 1003,1005,1007
102
130 1140,1145
200 1008,1103