Below is an example of the table data I have
| date | value | | 2020-01-01 | 20 | | 2020-01-14 | 10 | | 2020-02-02 | 30 | | 2020-02-11 | 25 | | 2020-02-25 | 25 | | 2020-03-13 | 34 | | 2020-03-21 | 10 | | 2020-04-06 | 55 | | 2020-04-07 | 11 |
I would like to generate a result set as below
| date | value | average | | 2020-01-01 | 20 | Jan average | | 2020-01-14 | 10 | Jan average | | 2020-02-02 | 30 | Jan & Feb average | | 2020-02-11 | 25 | Jan & Feb average | | 2020-02-25 | 25 | Jan & Feb average | | 2020-03-13 | 34 | Jan & Feb & Mar average | | 2020-03-21 | 10 | Jan & Feb & Mar average | | 2020-04-06 | 55 | Jan & Feb & Mar & Apr average | | 2020-04-07 | 11 | Jan & Feb & Mar & Apr average |
I tried to use window function OVER() and PARTITION() but I managed to get average on month by month rather than starting from the year.
Any suggestions, please.
Thanks
Advertisement
Answer
I think you want:
select t.*, avg(value) over( partition by year(date) order by month(date) ) running_avg from mytable t
This puts each year in a separate partition, and the order partition rows by month.