【问题标题】:Using one table to filter another one without join使用一张表过滤另一张表而不连接
【发布时间】:2020-12-18 05:54:21
【问题描述】:

我有两个表格/csv 文件。表 1 只有一列,采用日期格式。表 2 有客户 ID、加入和离开日期。我想在第一张表中列出每天的所有活跃客户。如 Table2.Join date

使用 Pandas 我做了以下事情,如果可能的话,我正在寻找一种改进它的方法,或者在 SQL 中实现它:

# Create a new column 
Table1['active_customers'] = Table1.date

for index, date in Table1.iterrows():
    Table1.active_customers[index] = Table2.loc[(Table2.date_joined <= date) \\
                                      & ((Table2.date_left > date) | 
                                          Table2.date_left.isnull())].user

表格如下:

Table 1
date
2010-12-09
2015-04-12
2018-10-27

Table 2
user  date_joined date_left
uid1  2006-01-09  2011-10-26
uid2  2008-05-18  2013-04-19
uid3  2010-11-29  2016-07-01
uid4  2011-09-16  2011-12-09
uid5  2013-11-17  
uid6  2015-05-31  
uid7  2019-06-20  

Output:
date        active_users
2010-12-09  uid1, uid2, uid3
2015-04-12  uid3, uid5
2018-10-27  uid5, uid6

【问题讨论】:

  • 您将需要提供一些实际示例数据和所需输出的示例。我不确定“...所有现有客户的列表”是什么意思?
  • @Manakin 问题被标记为postgresql
  • 感谢@AdrianKlaver
  • 样本数据很好,但您也应该指定预期的结果。
  • 感谢您的警告。我添加了更多数据和预期输出

标签: sql pandas postgresql


【解决方案1】:

用SQL实现很简单:

select
  t1.date,
  (
   select string_agg(user, ',')
     from table2 t2
     where t1.date >= t2.date_joined 
     and (t1.date < t2.date_left or t2.date_left is null)
  ) active_users
from table1 t1;

不使用join有什么具体原因吗?

【讨论】:

  • 我没有日期条件,如:t1.date = t2.data_joined。可能是我的 SQL 技能低,我认为这不是连接两个表,而且我没有匹配的键
  • 我不确定我是否理解“我没有日期条件”。你的意思是比较运算符?以上解决了你的问题吗?好吧,您可以通过表达式连接表,而不仅仅是匹配键。
【解决方案2】:

我认为 OP 关于“日期没有条件”的问题源于一种误解,即 JOINS 只能在 PK-FK 组合之间完成。这是不正确的;你几乎可以加入任何事情(更多内容)。对于手头的问题,加入解决方案是:

select t1.t1_date "Date" 
     , string_agg(t2.uid, ',') "Active Users" 
  from table2 t2
  join table1 t1
    on (    t1.t1_date >= t2.date_joined 
        and (t1.t1_date < t2.date_left or t2.date_left is null)
       )  
  group by t1.t1_date 
  order by t1.t1_date
;  

见小提琴here。注意:我更改了列名 DATE 和 USER。两者都是数据类型和/或保留字。使用任何一个作为列名都是非常糟糕的做法。

所以回到加入。正如我在上面指出的那样,您几乎可以加入任何事情。所需要的只是让要连接的数据类型具有可比性,并且只要您有多个谓词就是一个条件。连接条件连接表达式甚至不必在连接的表/视图中。小提琴在 CTE 中不存在的列上提供了一个示例。它的短处是“不要假设你不能加入,如果这是适当的方法,那就去做,或者至少编写测试条件。

【讨论】:

  • 非常感谢您教我这个!我以为我总是需要主键和外键来连接表。我还有一个问题:我在上面分享的 for 循环、您的解决方案和下面的@Stefanov.sm 的解决方案都会导致不同数量的用户......尽管您和 Stefanov.sm 的用户更接近。你怎么看待这件事?此外,我的数据集大小为 50K,这些查询导致每个日期最少 200K 行
  • 不客气。至于您与循环的区别,我真的无法评论,我不知道 Pandas。但就我的查询和@Stefanov.sm 而言,它们会产生相同的结果。见here。请注意最后一个查询,它实际上显示了它们之间的区别 - 没有。
猜你喜欢
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多