python - 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。谢谢您的帮助!
解决方案
大多数数据库都支持递归 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;
推荐阅读
- c# - 我可以将非 unicode 数据类型写入 Excel 吗?
- vba - 将字符串转换为双精度字(vba)
- validation - 表单提交后验证重置
- c# - 使用 Redis 实现排序、搜索和分页以获得最佳性能的最佳方式
- javascript - 使用 bind 来利用另一个 Javascript 类的方法
- javascript - Axios vue.js CORS 错误,代理未定义响应
- netty - 未调用 ChannelRead
- c++ - “由于调用...,noexcept-expression 评估为 'false'”是什么意思?
- python - 如何使用烧瓶在多个页面中显示用户名?
- java - 如何使用 Java 客户端在 Elasticsearch 中查询多值数组字段?