想象一下假定的查询返回:
---------- --------- ----------- --------- --------- --------- -------
| 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但是,无论如何,我还没有做出最终决定。你最好的解决方法是什么?
答案 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(注意最后一个带薪水的例子)。