gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:45:22 26 4
gpt4 key购买 nike

假设假设的查询返回:

 ---------- --------- ----------- --------- --------- --------- -------
| 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,但无论如何,我没有最终决定。解决它的最佳建议是什么?

最佳答案

将聚合函数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(注意最后一个有salary的例子)。

关于sql - 根据前一行的值计算一行的下一个内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com