根据前一行的值计算行的下一个内容

时间:2018-03-15 01:07:07

标签: sql postgresql

想象一下假定的查询返回:

 ---------- --------- ----------- --------- --------- --------- -------
|   DATE   | USER_ID | USER_NAME | HOURS_A | HOURS_R | RESIDUE | ACCUM |
 ---------- --------- ----------- --------- --------- --------- -------
|2018-03-15| 1234567 |    Joe    |    8    |    8    |    0    |   0   |
|2018-03-17| 1234567 |    Joe    |    8    |    10   |    2    |   2   |
|2018-03-19| 1234567 |    Joe    |    8    |    3    |   -5    |  -3   |
|2018-03-21| 1234567 |    Joe    |    8    |    9    |    1    |  -2   |
 ---------- --------- ----------- --------- --------- --------- -------

HOURS_A - >分配的时数
HOURS_R - >报告时数
ACCUM - >积累

正如您所看到的,单元格ACCUM的值是根据ACCUM列中最后一个值与残差左侧值的总和得出的。我可以在不使用游标的情况下获得此查询吗?我可以通过使用简单的简单查询来完成它。

我真的不知道如何解决它,但我不想让你告诉我文字的查询,而是我要求正确的方法来完成这个查询。我目前正在使用PostgreSQL。

我也想过创建一个函数并使用LOOP但是,无论如何,我还没有做出最终决定。你最好的解决方法是什么?

1 个答案:

答案 0 :(得分:0)

使用聚合函数sum()作为窗口函数。

with my_table(date, user_id, user_name, hours_a, hours_r, residue) as (
values
    ('2018-03-15', 1234567, 'Joe', 8, 8, 0),
    ('2018-03-17', 1234567, 'Joe', 8, 10, 2),
    ('2018-03-19', 1234567, 'Joe', 8, 3, -5),
    ('2018-03-21', 1234567, 'Joe', 8, 9, 1)
)
select *, sum(residue) over w as accum
from my_table
window w as (partition by user_name order by date)

    date    | user_id | user_name | hours_a | hours_r | residue | accum 
------------+---------+-----------+---------+---------+---------+-------
 2018-03-15 | 1234567 | Joe       |       8 |       8 |       0 |     0
 2018-03-17 | 1234567 | Joe       |       8 |      10 |       2 |     2
 2018-03-19 | 1234567 | Joe       |       8 |       3 |      -5 |    -3
 2018-03-21 | 1234567 | Joe       |       8 |       9 |       1 |    -2
(4 rows)

阅读窗口函数in the documentation(注意最后一个带薪水的例子)。