获取历史平均值和一个日期可能存在不止一次的值的计数

Get historical average and count of a value where a date could exist more than once

我有一个 table,其中包含多个相等的日期条目和一个值。我需要一个 table 来计算历史值和每个日期的条目数。我想稍后在 gnuplot/etc 中使用这些数据创建一些图表。

原始数据:

   date     | value
------------+------
 2017-11-26 |    5
 2017-11-26 |    5
 2017-11-26 |    5
 2017-11-28 |   20
 2017-11-28 |    5
 2018-01-07 |  200
 2018-01-07 |    5
 2018-01-07 |   20
 2018-01-15 |    5
 2018-01-16 |   50

输出应该是:

   date     |  avg   | count         manual calc explanation
------------+--------+-------       ---------------------------------------
 2017-11-26 |      5 |    3          (5+5+5) / 3 = 5
 2017-11-28 |      8 |    2          (5+5+5+20+5) / 5 = 8
 2018-01-07 | 33.125 |    3          (5+5+5+20+5+200+5+20) / 8 = 33.125
 2018-01-15 |     30 |    1          (5+5+5+20+5+200+5+20+5) / 9 = 30
 2018-01-16 |     32 |    1          (5+5+5+20+5+200+5+20+5+50) / 10 = 32

如果无法计算两个不同的列,我可以使用 avg 列。对于仅计算日期我有解决方案“SELECT DISTINCT date, COUNT(date) FROM table_name GROUP BY date ORDER BY date”

我试过 DISTINCT、GROUP BY、JOIN 等,但没有找到任何解决方案。我在网上找到了一些其他文章,但没有一篇涉及 table.

中多次列出日期的情况

您需要 运行 平均值(总值除以该行的总计数)。这是通过 window 函数完成的。

select
  date,
  sum(sum_value) over (order by date) as running_sum,
  sum(cnt) over (order by date) as running_count,
  sum(sum_value) over (order by date) /
  sum(cnt) over (order by date) as running_average
from
(
  select date, sum(value) as sum_value, count(*) as cnt 
  from mytable
  group by date
) aggregated
order by date;

演示:https://dbfiddle.uk/?rdbms=postgres_13&fiddle=fb13b63970cb096913a53075b8b5c8d7