SQL:使用现有表/ df中的信息创建新表/ df

时间:2019-10-18 14:55:52

标签: python sql postgresql dataframe

我有一个表,其中包含不同的广告系列,广告系列投放的总天数,日期以及总费用。我想为每个广告系列每天创建一行表格。例如,现在我有:

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如果有区别。感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

大多数数据库都支持递归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;