簡體   English   中英

SQL 查詢以識別父子關系中的模式

[英]SQL query to identify patterns in Parent-Child relationship

我正在金融機構中使用 Oracle 數據庫。 它有一個Credit Facility 表和一個Loan 表,處於父子關系(1-many)中。

作為項目的一部分,他們在這兩個表中添加了一個名為 Type Code 的新字段(使用一些涉及一堆其他字段值的復雜邏輯)。 我假設在絕大多數情況下,父 Credit Facility 和所有子 Loans 將被分配相同的類型代碼。 但事實證明,有數十萬個案例,信貸工具和貸款有不同的類型代碼,所有這些案例都必須以某種方式“處理”。 我能夠進行查詢以生成所有信貸便利和相關貸款的列表,其中 1 個或多個貸款與其父項具有不同的類型代碼,結果是 60 萬條記錄。

結果看起來像這樣(簡化)

示例 1

現在我想把它分解成模式,希望使用我可以分組的 1 個字段。 該字段應具有如下值:

示例 2

Pattern 字段應始終根據父項的類型代碼和子項的唯一值生成相同的值。 我不在乎每種類型的兒童貸款有多少或它們的順序是什么。

關於如何在 SQL 查詢中生成此 PATTERN 字段的任何想法? 我也可以在緊要關頭在 Excel 中做到這一點,但我什至不知道該怎么做,除了編寫 VBA 代碼之外,這是我最后的手段。

謝謝!

以下將產生您想要的結果,假設您重命名您的 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

db<>在這里擺弄

如果您想查看設施的模式,則可以使用listagg()作為分析 function:

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 ,請使用子查詢:

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

是一個 db<>fiddle。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM