【问题标题】:SQL: Creating new table/df using information from already existing table/dfSQL:使用现有表/df中的信息创建新表/df
【发布时间】:2019-10-18 14:55:52
【问题描述】:

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

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

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: python sql postgresql dataframe


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助,戈登!这可能是一个愚蠢的问题,但在第二部分中,gs(day) 和 gs.day 代表 Generate Series?或者是其他东西?除了非常简单的查询之外,我从未真正将 Postgres 用于其他任何事情。
  • 另外由于某种原因,我得到“错误:函数 generate_series(text, text, interval) 不存在。”我需要导入一些东西吗?
  • @trashdragon 。 . .是的,您需要修复您的数据模型,以便日期不会存储为字符串。同时,我在答案中添加了显式转换。
  • 作为对任何人的说明,这可能会有所帮助,我还必须将类型添加到 cost 以使其运行,因此第二段代码的第二行显示为 t.cost::numeric / (enddate::date - startdate::date + 1) as cost,跨度>
猜你喜欢
  • 2021-09-03
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多