我有一个数据表,但我需要的结果是前几行的总和。每行代表一个日期的数据记录,我需要当前的总和。
表格:
+------+-------+--------+
| date | group | change |
+------+-------+--------+
| 0 | a | 1 |
+------+-------+--------+
| 0 | b | 2 |
+------+-------+--------+
| 1 | a | 3 |
+------+-------+--------+
| 1 | b | 4 |
+------+-------+--------+
| 2 | a | 5 |
+------+-------+--------+
结果:
+------+-------+-------+
| date | group | sum |
+------+-------+-------+
| 0 | a | 1 |
+------+-------+-------+
| 0 | b | 2 |
+------+-------+-------+
| 1 | a | 4 | = 1 + 3
+------+-------+-------+
| 1 | b | 6 | = 2 + 4
+------+-------+-------+
| 2 | a | 11 | = 1 + 3 + 5
+------+-------+-------+
我也需要不考虑分组的相同结果:
+------+-------+
| date | sum |
+------+-------+
| 0 | 3 |
+------+-------+
| 1 | 10 |
+------+-------+
| 2 | 15 |
+------+-------+
我的应用程序的另一个细节是我从每个日期/组的已知初始总和开始,即max(date)+1
。我需要总和来考虑这些值。
我当前正在通过运行查询来完成此操作:
SELECT date, group, sum(change) FROM records GROUP BY date, group ORDER BY date DESC
然后在应用程序代码中,我从原始总和开始,向后遍历记录,再加上下一个日期,直到到达date_0。此解决方案对我有用,但是我想知道是否可以在SQL中完成所有这些操作?
答案 0 :(得分:1)
您可以尝试以下-DEMO
select *,sum(change) over(partition by group order by date) as s from t
order by date
对于无组-
select date,sum(s)
from
(
select *,sum(change) over(partition by group order by date) as s from t
)A group by date
答案 1 :(得分:1)
您似乎想要累积聚合。您可以按照以下方式进行操作:
select date, sum(sum(change)) over (order by date)
from t
group by date;