如何计算一个独特的值和

时间:2017-09-01 22:34:12

标签: sql postgresql

考虑这个数据集:

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。

2 个答案:

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