[英]SQL query to identify patterns in Parent-Child relationship
我正在金融機構中使用 Oracle 數據庫。 它有一個Credit Facility 表和一個Loan 表,處於父子關系(1-many)中。
作為項目的一部分,他們在這兩個表中添加了一個名為 Type Code 的新字段(使用一些涉及一堆其他字段值的復雜邏輯)。 我假設在絕大多數情況下,父 Credit Facility 和所有子 Loans 將被分配相同的類型代碼。 但事實證明,有數十萬個案例,信貸工具和貸款有不同的類型代碼,所有這些案例都必須以某種方式“處理”。 我能夠進行查詢以生成所有信貸便利和相關貸款的列表,其中 1 個或多個貸款與其父項具有不同的類型代碼,結果是 60 萬條記錄。
結果看起來像這樣(簡化)
現在我想把它分解成模式,希望使用我可以分組的 1 個字段。 該字段應具有如下值:
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
如果您想查看設施的模式,則可以使用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.