SQL查询汇总以前的结果

时间:2020-08-28 07:25:27

标签: sql sqlite

我有一个数据表,但我需要的结果是前几行的总和。每行代表一个日期的数据记录,我需要当前的总和。

表格:

+------+-------+--------+
| 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中完成所有这些操作?

2 个答案:

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