SQL总结了前x行

时间:2013-06-13 13:49:24

标签: sql performance postgresql-9.0

我有这样的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来获得从开始以来的实际点数总和。

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

2 个答案:

答案 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

拥有,以便在行上定义稳定的排序顺序以便使用此列。