我有这样的SQL结果:
name | points
------+-------
Joe | 2
Joe | 5
Joe | 4
Joe | 1
每一行代表Joe每个事件收到的点数。
Joe有一些基本预算,比方说100美元。
我现在需要做的是添加一个字段,该字段代表实际预算值,当一个点意味着10美元的加法时。像预算增长的历史。
结果应如下所示:
name | points | budget
------+--------+-------
Joe | 2 | 120
Joe | 5 | 170
Joe | 4 | 210
Joe | 1 | 220
变量的使用对我来说似乎是最好的解决方案,但是PostgreSQL对它并不友好,所以我正在寻找一个解决方案,使用结果的前x行的sumarization来获得从开始以来的实际点数总和。
您是否知道如何在不进行每行选择的情况下执行此操作?
答案 0 :(得分:1)
Postgres使用OVER
子句支持这种类型的累积,如下所示:
SELECT name, points, SUM(points * 10) OVER (ORDER BY .. order field ..)
FROM .. table ..
GROUP BY .. unique field ..
没有子选择的跨数据库替代方法是用您的宿主语言(php,java,等等)添加此列,而不是在数据库中添加。
答案 1 :(得分:1)
select name,
points,
100 + sum(points * 10) over (partition by name order by some_timestamp_column) as budget
from the_table
order by some_timestamp_column
您拥有,以便在行上定义稳定的排序顺序以便使用此列。