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
我期望生成如下所示的行号函数,以便我可以使用行号列进行分组。
行号是我生成的排序列,就是这样。
解决方案
我认为这只是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;
推荐阅读
- python - 在 tkinter 中删除特定的小部件
- javascript - Next.js:优化 LCP 时间/速度
- html - 如何更改 2x2 网格中 div 的顺序
- javascript - 如何模拟返回图像缓冲区的 axios 调用
- angular - 如何存储不同域的cookie
- flutter - 如何在 Flutter 中通过 package:in_app_purchase 将单个 IAP 产品用于多个项目
- azure - 带有条件的自动缩放实例计数的 Azure App-Service 警报
- python - 如何防止 x 轴上的日期拥挤在 MatPlotlib 动画上
- console - 无法查看控制台日志消息
- ruby-on-rails - 无法打开到 localhost:9200 的 TCP 连接 - Rails on Docker compose