如何对相同ID的记录汇总余额与支付总额并实现去重?
解决方案:按ID计算余额加支付总和并去重隐藏列
原始数据
| ID | BALANCE | PAYMENT | DATE |
|---|---|---|---|
| 1 | 157 | 3 | 1/3/2021 |
| 1 | 157 | 4 | 3/3/2021 |
| 1 | 157 | 7 | 4/3/2021 |
| 1 | 157 | 8 | 9/3/2021 |
| 2 | 304 | 9 | 21/2/2021 |
| 3 | 208 | 3 | 18/5/2021 |
步骤1:生成包含原记录与TOTAL的中间结果
使用窗口函数SUM() OVER (PARTITION BY ID)按ID分组计算所有PAYMENT的总和,再与BALANCE相加得到TOTAL。这条SQL会保留所有原始记录,并为每条记录添加上对应ID的TOTAL值:
SELECT ID, BALANCE, PAYMENT, DATE, BALANCE + SUM(PAYMENT) OVER (PARTITION BY ID) AS TOTAL FROM your_table_name;
执行后中间结果:
| ID | BALANCE | PAYMENT | DATE | TOTAL |
|---|---|---|---|---|
| 1 | 157 | 3 | 1/3/2021 | 179 |
| 1 | 157 | 4 | 3/3/2021 | 179 |
| 1 | 157 | 7 | 4/3/2021 | 179 |
| 1 | 157 | 8 | 9/3/2021 | 179 |
| 2 | 304 | 9 | 21/2/2021 | 313 |
| 3 | 208 | 3 | 18/5/2021 | 211 |
步骤2:嵌套查询去重并隐藏PAYMENT列
将上述查询作为子查询,通过DISTINCT去重(同一ID的BALANCE和TOTAL完全相同),同时只保留需要的列:
SELECT DISTINCT ID, BALANCE, TOTAL FROM ( SELECT ID, BALANCE, PAYMENT, DATE, BALANCE + SUM(PAYMENT) OVER (PARTITION BY ID) AS TOTAL FROM your_table_name ) AS temp;
最终结果:
| ID | BALANCE | TOTAL |
|---|---|---|
| 1 | 157 | 179 |
| 2 | 304 | 313 |
| 3 | 208 | 211 |
替代方案:直接分组计算
如果你的数据库支持,也可以用更简洁的GROUP BY方式实现,避免嵌套窗口函数:
SELECT ID, MAX(BALANCE) AS BALANCE, -- 同一ID的BALANCE值一致,用MAX/MIN均可 MAX(BALANCE) + SUM(PAYMENT) AS TOTAL FROM your_table_name GROUP BY ID;
内容的提问来源于stack exchange,提问作者Harold Choi
相关产品推荐
相关产品推荐

