1

我有一个这样的 SQL 结果:

 name | points
------+-------
 Joe  | 2
 Joe  | 5
 Joe  | 4
 Joe  | 1

每行代表 Joe 在每个事件中获得的分数。

乔有一些基本预算,比如说 100 美元。

我现在需要做的是添加一个字段,它代表实际预算值,当一个点意味着增加 10 美元时。类似于预算增长的历史。

结果应如下所示:

 name | points | budget
------+--------+-------
 Joe  | 2      | 120
 Joe  | 5      | 170
 Joe  | 4      | 210
 Joe  | 1      | 220

变量的使用对我来说似乎是最好的解决方案,但 PostgreSQL 对它不太友好,所以我正在寻找一种解决方案,使用结果的前 x 行的汇总来从一开始就获得实际点数总和。

您是否知道如何在每行中不进行子选择的情况下执行此操作?

4

2 回答 2

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

必须有一列在行上定义稳定的排序顺序才能使用它。

于 2013-06-13T13:58:10.257 回答
1

Postgres 使用OVER子句支持这种类型的累积,如下所示:

SELECT name, points, SUM(points * 10) OVER (ORDER BY .. order field ..)
FROM .. table ..
GROUP BY .. unique field ..

没有子选择的跨数据库替代方法是以您的主机语言(php、java 等)添加此列,而不是在数据库中执行此操作。

于 2013-06-13T13:57:16.770 回答