我有这张桌子:
月代表 | 水果 | 收获 |
---|---|---|
2021-09-01 | 139 | 139 |
2021-10-01 | 143 | 11 |
2021-11-01 | 152 | 14 |
2021-12-01 | 112 | 9 |
2022-01-01 | 133 | 10 |
2022-02-01 | 145 | 12 |
2022-03-01 | 123 | 5 |
2022-04-01 | 111 | 4 |
2022-05-01 | 164 | 9 |
2022-06-01 | 135 | 12 |
2022-07-01 | 124 | 14 |
2022-08-01 | 144 | 18 |
2022-09-01 | 111 | 111 |
2022-10-01 | 108 | 13 |
2022-11-01 | 123 | 7 |
2022-12-01 | 132 | 20 |
我想创建一个名为sold
基于计算的新列 - 这将是harvested
几个月(9 月至 6 月)内的运行总和。每年 9 月,sold
将始终为 1(或 100%)。2021 年 10 月的计算将是fruits
/ ( harvested
+ harvested_Nov
) = 143 / 11 + 139。
对于 2021 年的其余月份,遵循相同的格式:fruits
/ ( harvested
+ harvested_until_Sep
) --> 这将是一个运行总和,从您所在的月份开始,到上一年的 9 月结束。
2022 年的另一个示例是 2022 年 3 月的计算 = 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)。
该表应如下所示:
月代表 | 水果 | 收获 | 卖 |
---|---|---|---|
2021-09-01 | 139 | 139 | 1 |
2021-10-01 | 143 | 11 | 0.95 |
2021-11-01 | 152 | 14 | 0.93 |
2021-12-01 | 112 | 9 | 0.65 |
2022-01-01 | 133 | 10 | .. |
2022-02-01 | 145 | 12 | .. |
2022-03-01 | 123 | 5 | .. |
2022-04-01 | 111 | 4 | .. |
2022-05-01 | 164 | 9 | .. |
2022-06-01 | 135 | 12 | .. |
2022-07-01 | 124 | 14 | 无效的 |
2022-08-01 | 144 | 18 | 无效的 |
2022-09-01 | 111 | 111 | 1 |
2022-10-01 | 108 | 13 | 0.87 |
2022-11-01 | 123 | 7 | 0.94 |
2022-12-01 | 132 | 20 | .. |
我试过这个:
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
这很好用,但只有当我有 2022 年 9 月之前的数据时。我希望 Jul 和 Aug 为 null sold
- 这很有效。2022 年 8 月之后,2022 年 9 月应该是一个新的时期,其中sold
1。在那之后,2022 年 10 月将计算为fruits
/ ( harvested
+ harvested_Sep_2022
) - 我们从 2022 年 9 月 2 日到 2023 年 6 月的第二个时期开始一个新时期。
有没有办法对这些“时期”进行分组并对其进行汇总?我可能需要找到一种方法来对期间进行分组并从中进行分区。
将日期移动 8 个月,以便从 9 月到 6 月移动到 1 月到 9 月。然后你可以按年份分区:
db<>在这里摆弄
准确地产生您想要的结果。