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
相关产品推荐
相关产品推荐

