我有一个表,其中包含不同的广告系列,广告系列投放的总天数,日期以及总费用。我想为每个广告系列每天创建一行表格。例如,现在我有:
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如果有区别。感谢您的帮助!
答案 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;