You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL单行无嵌套查询实现按客户去重累加利润值方法咨询

客户利润去重求和问题

现有数据集

customer      buy          profit      
   a        laptop          350       
   a        mobile          350       
   b        laptop case     50       
   c        laptop          200       
   c        mouse           200    

规则与需求

  • 字段规则:无论单个客户对应多少条购买记录,每行的profit字段值已经是该客户的累计利润,例如客户a的总利润为350,客户c的总利润为200
  • 计算要求:必须通过单行代码实现,禁止使用子查询、嵌套查询,也不能单独编写CTE
  • 目标结果:对所有客户的利润值去重后求和,期望输出为350 + 50 + 200 = 600

已尝试的无效方案

之前尝试过窗口分区取最大值、SUM(DISTINCT)写法均无法满足需求,尝试过的代码片段如下:

MAX(profit) OVER (PARTITION BY customer)

实现方案

直接用窗口函数做行级权重折算即可,完全满足无嵌套、无CTE、无单独子查询的单行要求:
同一个客户的所有记录profit值完全相同,把每条记录的利润除以该客户对应的记录条数,再对所有折算后的值求和,就能自动把同客户的多份重复利润折成1份累计值,直接得到去重后的客户利润总和。

单行实现代码:

SELECT SUM(profit / COUNT(*) OVER (PARTITION BY customer)) AS total_customer_profit FROM your_table;

如果使用的数据库存在整数截断问题,可以把profit替换为profit * 1.0保证计算精度

逻辑校验

  • 客户a共2条记录,单条折算值为350/2 = 175,两条合计贡献350
  • 客户b共1条记录,单条折算值为50/1 = 50,合计贡献50
  • 客户c共2条记录,单条折算值为200/2 = 100,两条合计贡献200
  • 最终求和结果正好为600,完全匹配预期

内容的提问来源于stack exchange,提问作者tlqn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:27:22