首页 > 解决方案 > 需要根据匹配的冲销对记录进行分组

问题描述

这个问题是我之前帖子的延续。

需要根据sql中的匹配反转对记录进行分组

从我的交易表中举一个复杂的例子,我会更清楚。

Row_Number  LOAN_ID TXN_ENTRY_API_NAME          TXN_AMT
        1   100     ReverseSpreadPayment        2250
        2   100     SpreadPayment               -2250
        3   100     ReverseSpreadPayment        2250
        4   100     SpreadPayment               -2250
        5   100     ReverseSpreadPayment        2250
        6   100     SpreadPayment               -2250
        7   100     ReverseSpreadPayment        2250
        8   100     ReverseSpreadPayment        2250
        9   100     SpreadPayment               1000

在上面的例子中

第 1 行和第 2 行是匹配的记录 bcoz 付款有关联的反向付款,因此将这两者相加。第 3 行和第 4 行是匹配的记录 bcoz 付款具有关联的反向付款,因此将这两者相加。第 5 行和第 6 行是匹配的记录 bcoz 付款有关联的反向付款,因此将这两者相加。第 7 行没有关联的匹配付款金额,因此是 ophan。保持原样。第 8 行没有关联的匹配付款金额,因此是 ophan。保持原样。第 9 行没有关联的匹配反向支付金额,因此是 ophan。保持原样。

为了更好地了解您,我只是在此处添加了 row_number 列,而在我的事务表中,我们没有任何 row_number 列。

我的预期输出应该如下表所示。

                    LOAN_ID     TXN_ENTRY_API_NAME                 TXN_AMT
                        100     ReverseSpreadPayment,SpreadPayment  0
                        100     ReverseSpreadPayment,SpreadPayment  0
                        100     ReverseSpreadPayment,SpreadPayment  0
                        100     ReverseSpreadPayment                2250
                        100     ReverseSpreadPayment                2250
                        100     SpreadPayment                       1000

我期望生成如下所示的行号函数,以便我可以使用行号列进行分组。

行号是我生成的排序列,就是这样。

标签: sqldatabaseoracleaggregaterow-number

解决方案


我认为这只是row_number()和聚合:

select listagg(row_number, ',') within group (order by row_number) as row_numbers,
       loan_id, txn_entry_api_name, sum(txn_amt) as txn_amt,
       listagg(txn_entry_api_name, ',') within group (order by row_number) as txn_entry_api_name
from (select t.*,
             row_number() over (partition by loan_id, txn_entry_api_name, abs(txn_amt) order by row_number) as seqnum
      from t
     ) t
group by seqnum;

推荐阅读