Eu tenho essa tabela:
mês_rep | frutas | colhido |
---|---|---|
01-09-2021 | 139 | 139 |
01-10-2021 | 143 | 11 |
01-11-2021 | 152 | 14 |
01-12-2021 | 112 | 9 |
01-01-2022 | 133 | 10 |
01-02-2022 | 145 | 12 |
01-03-2022 | 123 | 5 |
01-04-2022 | 111 | 4 |
01-05-2022 | 164 | 9 |
01-06-2022 | 135 | 12 |
01-07-2022 | 124 | 14 |
01-08-2022 | 144 | 18 |
01-09-2022 | 111 | 111 |
01-10-2022 | 108 | 13 |
01-11-2022 | 123 | 7 |
01-12-2022 | 132 | 20 |
Eu quero criar uma nova coluna chamada sold
que é baseada em um cálculo - que será uma soma em execução harvested
em um período de meses (set-jun). Todo mês de setembro, sold
sempre será 1 (ou 100 em por cento). O cálculo para outubro de 2021 será fruits
/ ( harvested
+ harvested_Nov
) = 143 / 11 + 139.
Para os restantes meses de 2021, segue o mesmo formato: fruits
/ ( harvested
+ harvested_until_Sep
) --> esta será uma soma corrente, a partir do mês em que se encontra, e termina em setembro do ano anterior.
Outro exemplo para 2022 é o cálculo para março de 2022 = fruits
/ ( harvested
+ harvested_Feb_2022
+ harvested_Jan_2022
+ harvested_Dec_2021
+ harvested_Nov_2021
+ harvested_Oct_2021
+ harvested_Sep_2021
) = 123 / (5+12+10+9+14+11+139).
A tabela deve ficar assim:
mês_rep | frutas | colhido | vendido |
---|---|---|---|
01-09-2021 | 139 | 139 | 1 |
01-10-2021 | 143 | 11 | 0,95 |
01-11-2021 | 152 | 14 | 0,93 |
01-12-2021 | 112 | 9 | 0,65 |
01-01-2022 | 133 | 10 | .. |
01-02-2022 | 145 | 12 | .. |
01-03-2022 | 123 | 5 | .. |
01-04-2022 | 111 | 4 | .. |
01-05-2022 | 164 | 9 | .. |
01-06-2022 | 135 | 12 | .. |
01-07-2022 | 124 | 14 | nulo |
01-08-2022 | 144 | 18 | nulo |
01-09-2022 | 111 | 111 | 1 |
01-10-2022 | 108 | 13 | 0,87 |
01-11-2022 | 123 | 7 | 0,94 |
01-12-2022 | 132 | 20 | .. |
Eu tentei isso:
select
month_rep,
fruits,
harvested,
case when extract(month from "month_rep") in (7, 8) then null
when extract(month from "month_rep") = 9 then 1
else ROUND(fruits / sum(harvested) over (order by month_rep), 2) end sold
from my_table
Isso funciona bem, mas apenas quando tenho dados antes de setembro de 2022. Eu quero que julho e agosto tenham null sold
- o que funciona. Após agosto, setembro de 2022 deve ser um novo período onde sold
é 1. Depois disso, outubro de 2022 será calculado como fruits
/ ( harvested
+ harvested_Sep_2022
) - onde iniciamos um novo período para o 2º período de setembro de 2022 a junho de 2023.
Existe uma maneira de agrupar esses "períodos" e ter a soma acumulada sobre isso? Talvez eu precise encontrar uma maneira de agrupar o período e particionar a partir disso.
Mude a data em 8 meses, para que set-jun passe para jan-set. Então você pode particionar por ano:
db<>fique aqui
Produz exatamente o resultado desejado.