SQL запрос для определения закономерностей в отношениях между родителями и детьми - PullRequest
0 голосов
/ 25 апреля 2020

Я работаю с базой данных Oracle в финансовом учреждении. Он имеет таблицу Credit Facility и таблицу Loan в отношении «родитель-потомок» (1-многие).

В рамках проекта они добавили новое поле с именем Type Code в обе эти таблицы (используя некоторые сложные логики c, включающие значения множества других полей). Я предполагал, что в подавляющем большинстве случаев родительской кредитной линии и всем дочерним кредитам будет присвоен один и тот же код типа. Но оказывается, что существуют сотни тысяч случаев, когда Кредитная линия и Кредит имеют разные коды типов, и все эти случаи должны как-то «обрабатываться». Мне удалось сделать запрос, чтобы сгенерировать список всех кредитных линий и связанных с ними ссуд, где 1 или более ссуд имеют код типа, отличный от его родительского, и в результате было 600 тыс. Записей.

Результаты выглядят так (упрощенно)

example 1

Теперь я хочу разбить его на шаблоны, надеюсь, используя 1 поле, по которому я могу сгруппироваться. Поле должно иметь следующие значения:

example 2

Поле Pattern должно всегда генерировать одно и то же значение на основе кода типа родителя и уникальных значений дочерних элементов. Меня не волнует, сколько существует дочерних ссуд каждого типа или в каком порядке.

Есть идеи, как сгенерировать это поле PATTERN в запросе SQL? Я мог бы также сделать это в Excel в крайнем случае, но даже не уверен, как это сделать, если не писать код VBA, который является моим последним средством.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Если вы хотите посмотреть шаблоны для объектов, вы можете использовать listagg() в качестве аналитической c функции:

select t.*,
       (t.facility_num || '-' ||
        listagg(t.loan_type, ',') within group (order by loan_num) over (partition by facility_num)
       ) as pattern
from t;

Эти результаты немного отличаются от ваших результатов. Они начинаются с типа объекта и включают все ссуды, включая дубликаты.

Если вы хотите различить loan_type s, используйте подзапрос:

select t.*,
       (t.facility_num || '-' ||
        listagg(case when seqnum = 1 then t.loan_type end, ',') within group
            (order by loan_num) over
            (partition by facility_num)
       ) as pattern
from (select t.*,
             row_number() over (partition by facility_num, loan_type order by loan_num) as seqnum
      from t
     ) t

Здесь - это дБ <> скрипка.

0 голосов
/ 25 апреля 2020

Следующие результаты приведут к желаемым результатам, при условии, что вы переименуете свои поля TYPE, чтобы они отличались друг от друга - одно, вероятно, должно быть FACILITY_TYPE, а другое, по-видимому, должно быть LOAN_TYPE:

WITH cteDistinct_facility_loan_types
       AS (SELECT DISTINCT FACILITY_NUM,
                  LOAN_TYPE
             FROM YOUR_TABLE),
     cteFacility_loan_types
       AS (SELECT FACILITY_NUM,
                  LISTAGG(LOAN_TYPE, ',')
                    WITHIN GROUP (ORDER BY FACILITY_NUM) AS FACILITY_LOAN_TYPES
             FROM cteDistinct_facility_loan_types
             GROUP BY FACILITY_NUM)
SELECT t.*,
       t.FACILITY_TYPE || '-' || flt.FACILITY_LOAN_TYPES AS PATTERN
  FROM YOUR_TABLE t
  INNER JOIN cteFacility_loan_types flt
    ON flt.FACILITY_NUM = t.FACILITY_NUM
  ORDER BY t.FACILITY_NUM

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...