如何根据某些条件加入两个表?

时间:2016-12-21 11:32:03

标签: sql join sas

我有两张桌子:

  1. Customer_Master 列 - cust_id,Date_of_birth 表格中有100行

  2. Date_became_member 列 - Date_became_member 表中有1000行重复。

  3. 这两个表没有任何共同密钥。

    现在我想加入这两个表,其中表2中的日期将是 有6000天。在连接期间,如果发现间隔为6000天,则应该停止当前cust_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。我的目标是模拟数据。为此我使用随机日期创建了上面的表。现在我想标记一个客户成为成员的日期随机日期。但条件是应该在date_of_birth和Date_became_member之间至少有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  
    

    逻辑是,date_of_birth和Date_became_member之间至少应该有16年的差距,如果它找到了16年的差距 从表2中的任何一个日期开始,它应仅采用该日期,而不是任何其他日期间隔为16年或更长的日期。

2 个答案:

答案 0 :(得分:1)

除非Date_became_member有一列将其与Customer_Master中的特定行相关联,否则您无法有意义地加入它们。要在具有明确连接的行之间建立连接,我们通常使用外键关系(有关详细信息,请参阅here)。

如果Date_became_member确实有cust_id列,就像Customer_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_became_member表格中没有其他列,那么我会建议它的实用性非常有限,并且重新设计可能是有序的。

如果您确实需要一个联接,以显示Customer_Master中每一行加入到每行Date_became_member,那么您需要一个CROSS JOIN

     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

答案 1 :(得分:0)

我认为您的问题的主要内容是如何找到符合您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;