Postgresql

幾個月內的累計金額

  • August 3, 2022

我有這張桌子:

我想創建一個名為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)。

該表應如下所示:

我試過這個:

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 月應該是一個新的時期,其中sold1。在那之後,2022 年 10 月將計算為fruits/ ( harvested+ harvested_Sep_2022) - 我們從 2022 年 9 月 2 日到 2023 年 6 月的第二個時期開始一個新時期。

有沒有辦法對這些“時期”進行分組並對其進行匯總?我可能需要找到一種方法來對期間進行分組並從中進行分區。

將日期移動 8 個月,以便從 9 月到 6 月移動到 1 月到 9 月。然後你可以按年份分區:

SELECT *
    , CASE extract(month FROM month_rep)
        WHEN 7 THEN NULL
        WHEN 8 THEN NULL
        WHEN 9 THEN 1
        ELSE round(fruits::numeric / sum(harvested) OVER (PARTITION BY date_trunc('year', month_rep - interval '8 mon') ORDER BY month_rep), 2)
      END AS sold
FROM   tbl
ORDER  BY month_rep;

db<>在這裡擺弄

準確地產生您想要的結果。

引用自:https://dba.stackexchange.com/questions/315112