SQL求助:如何标记同一Account分组下正负相加和为0的数值
解决方案
以下方案兼容支持窗口函数的主流SQL版本(MySQL 8.0+、PostgreSQL、SQL Server、Hive等):
实现思路
- 先按
Account字段分区,再按金额的绝对值、金额正负做次级分组 - 对同分区、同绝对值的正负金额分别编号,编号相同的记录即可配对(总和为0)
- 给配对成功的记录生成统一的Flag标识,未配对的记录Flag留空
示例代码
WITH amount_rn AS ( SELECT *, -- 按Account分区,相同绝对值的金额为一组,给正负值分别编序号 ROW_NUMBER() OVER ( PARTITION BY Account, ABS(Amount), SIGN(Amount) ORDER BY id -- 这里id替换为你表内的唯一标识字段,保证排序稳定 ) AS rn FROM transaction_table -- 替换为你的实际表名 ), pair_flag AS ( SELECT *, -- 统计同Account、同绝对值、同序号的正负记录数,=2说明配对成功 COUNT(*) OVER ( PARTITION BY Account, ABS(Amount), rn ) AS pair_cnt FROM amount_rn ) SELECT Account, Amount, -- 生成Flag标识,可根据需求调整格式 CASE WHEN pair_cnt = 2 THEN CONCAT('Pair_', ABS(Amount), '_', rn) ELSE NULL END AS Flag -- 其他需要保留的字段可自行补充 FROM pair_flag;
适配说明
- 如果你的数据库不支持CTE语法,可以把上面的嵌套逻辑改成子查询实现
- 如果存在多组相同绝对值的金额需要配对,代码会自动按你指定的排序规则依次配对,不会出现重复匹配的问题
- 如果不需要具体的配对组标识,只需要标记是否配对成功,把Flag的生成逻辑改成
CASE WHEN pair_cnt=2 THEN 'Y' ELSE 'N' END即可
内容的提问来源于stack exchange,提问作者Shahul
相关产品推荐
相关产品推荐

