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

SQL按rank逐行计算新列D,使用partition by未生效如何解决?

SQL实现按rank累计差值计算新列D

核心逻辑

你要计算的D列本质是:当前行count减去同Name下所有rank小于当前行的count总和,我们可以通过两种方式实现:

实现方式1:窗口函数(支持MySQL8.0+、PostgreSQL、Hive、Spark SQL等主流新数据库)

SELECT 
    Name,
    `count`, -- count是SQL关键字,建议加反引号转义
    `rank`, -- rank也是SQL关键字,建议加反引号转义
    `count` - COALESCE(SUM(`count`) OVER (
        PARTITION BY Name 
        ORDER BY `rank` 
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
    ), 0) AS D
FROM 你的表名;

逻辑说明

  • PARTITION BY Name:按Name字段分组,不同Name的计算相互隔离
  • ORDER BY rank:窗口内按rank升序排序,保证计算顺序符合要求
  • SUM(count) OVER (...):计算同分组内、排在当前行之前的所有行的count总和,rank=1时没有前置行,求和结果为null,用COALESCE函数转成0即可得到正确结果

实现方式2:关联子查询(兼容所有SQL版本,包括低版本MySQL)

SELECT 
    t1.Name,
    t1.`count`,
    t1.`rank`,
    t1.`count` - COALESCE(SUM(t2.`count`), 0) AS D
FROM 你的表名 t1
LEFT JOIN 你的表名 t2 
    ON t1.Name = t2.Name 
    AND t2.`rank` < t1.`rank`
GROUP BY t1.Name, t1.`count`, t1.`rank`
ORDER BY t1.Name, t1.`rank`;

逻辑说明

通过自连接把当前行和同Name下所有rank更小的行关联,汇总这些行的count总和,再用当前行count减去该总和得到D值。

两种写法都可以得到你给出的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:39:02