ORACLE SQL группа на основе значений в справочной таблице - PullRequest
0 голосов
/ 10 февраля 2020

Таблица клиентов и таблицы Acct имеют глобальную область действия, они разделяют и увеличивают это значение

Ниже таблица клиентов, SEQ NO 1 - начало данных клиента, SEQ_NO 238 - начало других данных клиента

enter image description here

Еще одна таблица счетов, все учетные записи с их SEQ_NO внутри границы клиента получают одну и ту же группу (я хочу сгруппировать эти счета по одному клиенту, чтобы я можно использовать listAgg для объединения идентификатора учетной записи.), например, ниже из SEQ_NO 2 и NO 224 (включительно) должны быть назначены на ту же группу.

enter image description here

Есть ли SQL способ сделать это, В худшем случае я подумал, чтобы определить oracle тип, и с помощью функции сделать это.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 10 февраля 2020

Если я правильно понимаю ваш вопрос, вы хотите иметь возможность назначать строки в таблице счетов для групп , по одной на каждого клиента, чтобы затем можно было агрегировать на основе этих групп.

Таким образом, вопрос заключается в том, как определить, к какому клиенту относится каждая учетная запись, на основе границ последовательности, указанных в первой таблице («клиент»), и указанных 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 
...