Sql 如何基于某些条件连接两个表?

Sql 如何基于某些条件连接两个表?,sql,join,sas,Sql,Join,Sas,我有两张桌子: Customer\u Master 列-客户id、出生日期 表中有100行 成为成员的日期 列-成为成员的日期 表中有1000行重复 这两个表没有任何公用键 现在我想把这两个表连接起来,表2中的日期将 有6000天。在加入期间,如果发现6000天的间隔,则应停止当前客户id的过程 我正在尝试下面的代码,但没有得到想要的输出 select a.*, b.Date_became_member from Customer_Master as a ,Date_became_me

我有两张桌子:

  • Customer\u Master
    列-客户id、出生日期 表中有100行

  • 成为成员的日期
    列-成为成员的日期 表中有1000行重复

  • 这两个表没有任何公用键

    现在我想把这两个表连接起来,表2中的日期将 有6000天。在加入期间,如果发现6000天的间隔,则应停止当前客户id的过程

    我正在尝试下面的代码,但没有得到想要的输出

    select a.*, b.Date_became_member
    from Customer_Master as a 
        ,Date_became_member as b
    where b.Date_became_member - a.Date_of_birth = 6000
    

    我使用的是SAS\SQL。我的目标是模拟数据。为此,我使用随机日期创建了上面的表。现在我想用某个随机日期标记客户成为成员的日期。但条件是,在出生日期和成为成员日期之间至少应有16年的间隔

    Table 1 - Customer_Master
    
    cust_id           date_of_birth  
    10013             1970/02/21  
    10015             1989/11/14  
    10016             1979/02/05  
    10017             1986/05/26
    
    Table 2 - Date_became_member
    
    Date_became_member  
    1986/03/25  
    1992/11/21  
    1994/01/24  
    1998/11/21  
    2004/01/24  
    2001/08/25  
    1995/07/07  
    1979/02/21  
    1997/06/07  
    2005/02/21  
    2006/09/11
    
    Desired output
    
    cust_id      date_of_birth           Date_became_member  
    10013        1970/02/21               1986/03/25  
    10015        1989/11/14               2006/09/11  
    10016        1979/02/05               1995/07/07  
    10017        1986/05/26               2004/01/24  
    
    其逻辑是,从_的出生日期到_成为_成员的日期之间至少应该有16年的间隔,如果发现间隔为16年
    从表2中的任何日期开始,应仅取该日期,而不是间隔16年或更长的任何其他日期。

    除非
    日期成为成员
    有一列链接到
    客户主文件中的一行或多行
    ,否则您无法有意义地加入它们。为了在具有明确连接的行之间建立连接,我们通常使用外键关系(有关更多信息,请参阅)

    如果
    Date\u befored\u member
    确实有一个
    cust\u id
    列,如
    Customer\u Master
    表,则您的查询如下所示:

    SELECT cm.cust_id 
         , cm.date_of_birth
         , dbm.Date_became_member
      FROM Customer_Master AS cm 
      JOIN Date_became_member AS dbm
        ON cm.cust_id = dbm.cust_id
     WHERE dbm.Date_became_member - CM.Date_of_birth = 6000
    
    如果在
    Date\u befored\u member
    表中没有其他列,那么我建议它的实用性是非常有限的,重新设计很可能是正确的

    如果您确实希望加入一个显示
    Customer\u Master
    中的每一行,并加入到
    Date\u成为成员的每一行中,那么您需要一个
    交叉加入

         SELECT cm.cust_id 
              , cm.date_of_birth
              , dbm.Date_became_member
           FROM Customer_Master AS cm 
     CROSS JOIN Date_became_member AS dbm
          WHERE dbm.Date_became_member - CM.Date_of_birth = 6000
    

    我想你问题的重点是如何找到符合你16岁要求的第一次约会。为此,您需要按客户对数据进行分组。要查找16年间隔,可以使用
    INTNX()
    函数

    proc sql ;
      create table want as
        select cust_id,dob,date_became_member
        from customer_master
        left join date_became_member
        on date_became_member > intnx('year',dob,16,'same')
        group by 1,2
        having date_became_member= min(date_became_member)
      ;
    quit;
    

    对不起,我不明白你的问题。为什么要联接两个没有公共id的表。6000天是多少天?这已经超过16年了。您能给出表格中数据的示例以及您想要的输出吗?编辑您的问题并提供示例数据和所需结果。也,用您正在使用的数据库标记问题。我使用的是SAS\SQL。我的目标是模拟数据。为此,我使用随机日期创建了上面的表。现在,我想用某个随机日期标记客户成为成员的日期。但条件是出生日期和成为成员日期之间至少应有16年的间隔。再次:您的询问并添加一些样本数据以及基于该数据的预期输出。请发短信,