获取历史平均值和一个日期可能存在不止一次的值的计数
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
我有一个 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