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

标签 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。感谢您的帮助!

最佳答案

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

关于python - SQL:使用现有表/df 中的信息创建新表/df,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453383/

相关文章:

python - 将分钟格式的时间列转换为 HH :MM:SS format in pandas 格式的时间

python - TensorFlow 2 - NumPy 数值和数组是否会导致 TF 函数产生新图?

python - 无法从类中抓取文本 (BeautifulSoup)

mysql - 数据收集多个表?

sql - T-SQL - GROUP BY 和 LIKE - 这可能吗?

sql - oracle时间戳到postgres时间戳的转换?

python - 如何通过python将Web抓取数据导出到csv

sql - 如何在sql中提取周数

sql - 从函数返回 CASE 表达式的聚合

PostgreSQL:如何在长输出中向上滚动