首页 > 解决方案 > SQL:使用现有表/df中的信息创建新表/df

问题描述

我有一张表格,其中包含不同的广告系列、广告系列与日期一起运行的总天数以及总成本。我想为每个广告系列的每一天创建一个包含一行的表格。例如,现在我有:

Campaign    Total Cost  Total Days   Start Date     End Date
Campaign A    $10          3         Jan 1, 2011    Jan 3, 2011
Campaign B    $12          2         Jan 2, 2011    Jan 3, 2011
Campaign C     $8          1         Jan 4, 2011    Jan 4, 2011

我想要类似的东西:

Campaign      Cost        Day
Campaign A    $3.33     2011-01-01
Campaign A    $3.33     2011-01-02
Campaign A    $3.33     2011-01-03
Campaign B    $6        2011-01-02
Campaign B    $6        2011-01-03
Campaign C    $8        2011-01-04

以便将其拆分为日值。

我尝试将其导入到 pandas 数据框中,并通过迭代第一个表中的行将它们添加到那里,但由于某些活动持续了一年左右,因此效率非常低。有没有更简单的方法可以用 SQL 做到这一点?或者你能想到的另一种方法?我完全是新手,所以我不确定。如果有区别,我会使用 postgresql/python。谢谢您的帮助!

标签: pythonsqlpostgresqldataframe

解决方案


大多数数据库都支持递归 CTE,您可以使用它:

with recursive cte as (
      select campaign, cost, startdate as day, enddate,
             (enddate - startdate) + 1 as num_days
      from t
      union all
      select campaign, cost, startdate + interval '1 day' as day, enddate, num_days
      from t
      where startdate < enddate
     )
select campaign, cost / num_days, day
from cte
order by campaign, day;

在 Postgres 中,我建议generate_series()

select t.campaign,
       t.cost / (enddate::date - startdate::date + 1) as cost,
       gs.day
from t cross join lateral
     generate_series(startdate::date, enddate::date, interval '1 day') gs(day)
order by campaign, day;

推荐阅读