考虑这个数据集:
id site_id type_id value date
------- ------- ------- ------- -------------------
1 1 1 50 2017-08-09 06:49:47
2 1 2 48 2017-08-10 08:19:49
3 1 1 52 2017-08-11 06:15:00
4 1 1 45 2017-08-12 10:39:47
5 1 2 40 2017-08-14 10:33:00
6 2 1 30 2017-08-09 07:25:32
7 2 2 32 2017-08-12 04:11:05
8 3 1 80 2017-08-09 19:55:12
9 3 2 75 2017-08-13 02:54:47
10 2 1 25 2017-08-15 10:00:05
我想构建一个查询,按类型返回每个日期的运行总计。我可以通过窗口函数来关闭,但我只希望将每个站点的最新值与运行总计相加(一个简单的窗口函数将不起作用,因为它总结了所有值到一个日期 - 不仅仅是每个站点的最后一个值)。所以我想它可以更好地描述为一个独特的运行总量?
我正在寻找的结果是这样的:
type_id date sum
------- ------------------- -------
1 2017-08-09 06:49:47 50
1 2017-08-09 07:25:32 80
1 2017-08-09 19:55:12 160
1 2017-08-11 06:15:00 162
1 2017-08-12 10:39:47 155
1 2017-08-15 10:00:05 150
2 2017-08-10 08:19:49 48
2 2017-08-12 04:11:05 80
2 2017-08-13 02:54:47 155
2 2017-08-14 10:33:00 147
这里的关键是总和不是运行总和。它应该只是每个站点的最新值的总和,按类型,在每个日期。我想我可以通过浏览上面提供的结果集来帮助解释它。对于我的解释,我将按时间顺序浏览原始数据并尝试解释预期结果。
结果的第一行开始于2017-08-09 06:49:47,按时间顺序,只有一个类型1的记录,它是50,所以这是2017-08的总和-09 06:49:47。
结果的第二行是2017-08-09 07:25:32,此时我们有2个唯一的网站,其值为type_id = 1.它们的值为50和30,所以总和是80岁。
第三行结果发生在2017-08-09 19:55:12,现在我们有3个站点,其值为type_id = 1. 50 + 30 + 80 = 160。
第四行是有趣的地方。在2017-08-11 06:15:00有4条记录,type_id = 1,但其中2条是针对同一网站的。我只对每个网站的最新价值感兴趣,因此我想要总和的值是:30 + 80 + 52 导致 162 。
第5行类似于第4行,因为site_id的值:1,type_id:1再次更改,现在是45.这将导致type_id的最新值:1:2017-08-12 10:39: 47现在:30 + 80 + 45 = 155。
当我们考虑在2017-08-15 10:00:05,站点2为type_id 1有一个新值时,回顾第6行也很有趣,它给出了我们:80 + 45 + 25 = 150 2017-08-15 10:00:05。
答案 0 :(得分:0)
您可以通过在窗口框架中包含ORDER BY
子句来获得累计总计(运行总计)。
select
type_id,
date,
sum(value) over (partition by type_id order by date) as sum
from your_table;
ORDER BY
有效,因为
默认框架选项为
RANGE UNBOUNDED PRECEDING
,与RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
相同。
答案 1 :(得分:0)
SELECT type_id,
date,
SUM(value) OVER (PARTITION BY type_id ORDER BY type_id, date) - (SUM(value) OVER (PARTITION BY type_id, site_id ORDER BY type_id, date) - value) AS sum
FROM your_table
ORDER BY type_id,
date