PostgreSQL中如何按指定行号计算数据小计?
首先,你原来的SQL语句只会返回一个单独的小计值,没法关联到id=3的那条记录,所以得不到你想要的结果。这里有两种更简洁的实现方式:
方法一:使用窗口函数(推荐)
窗口函数可以直接计算累计总和,同时保留当前行的信息,写法最简洁:
SELECT id, SUM(score) OVER (ORDER BY id) AS subtotal, name FROM main WHERE id = 3;
SUM(score) OVER (ORDER BY id)会自动计算从id最小的行到当前行的score累计值,当筛选id=3时,正好得到所有id<=3的score总和60,同时返回该行的id和name,完全匹配你的期望结果。
方法二:子查询关联
先通过子查询算出id<=3的score小计,再和原表关联取出目标行:
SELECT m.id, s.subtotal, m.name FROM main m JOIN (SELECT SUM(score) AS subtotal FROM main WHERE id <= 3) s WHERE m.id = 3;
这种方式逻辑直观,适合对窗口函数不太熟悉的场景。
如果需要替换成动态变量(比如把3换成其他值),不同数据库的变量语法略有差异,比如MySQL可以用SET @target_id = 3;,然后在查询中替换3为@target_id即可。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

