Postgres - 如何从给定的总体预算和开始日期/结束日期生成每日预算

时间:2018-04-19 17:18:52

标签: sql postgresql

例如,如果我有下表:

campaign   | budget     | start_date  | end_date
-----------|------------|-------------|------------
Microsoft  | 25400      | 2018-04-01  | 2018-06-30
VMWare     | 12340      | 2018-04-01  | 2018-06-01

如何使用开始日期和结束日期为我提供广告系列有效的天数,以便我可以将该数字除以总预算以获得每日预算?我希望在2018-04-01和2018-06-30之间的日期系列中适合它。

我希望得到一张这样的表:

date       | daily_budget
-----------|--------------
2018-04-01 | 486
2018-04-02 | 486
2018-04-03 | 486
(...)
2018-06-29 | 282
2018-06-30 | 282

1 个答案:

答案 0 :(得分:0)

要获取某个范围内的所有日期,您可能会使用递归CTE。要在某个时间间隔内获取天数,您只需按日期分组即可减去并汇总不同的广告系列。 This SQL Fiddle似乎是您正在寻找的内容(下面的代码)。

WITH RECURSIVE calendar(
  campaign
  , budget_date
  , end_date
) AS
(
    SELECT 
      campaign
      , start_date budget_date
      , end_date 
    FROM 
      budgetTotal
    UNION ALL 
    SELECT 
      c.campaign
      , c.budget_date + 1
      , c.end_date
    FROM 
      calendar c 
    WHERE 
      c.budget_date < c.end_date
  )
SELECT 
  c.budget_date 
  , ROUND(
      SUM(bt.budget / (bt.end_date - bt.start_date))
      , 2
  ) dailyBudget 
 FROM 
   budgetTotal bt
 JOIN 
   calendar c
   ON 
   c.budget_date BETWEEN bt.start_date AND bt.end_date
   AND 
   c.campaign = bt.campaign
 GROUP BY 
   c.budget_date
 ORDER BY 
   c.budget_date