我有两张桌子:
Customer_Master
列 - cust_id,Date_of_birth
表格中有100行
Date_became_member
列 - Date_became_member
表中有1000行重复。
这两个表没有任何共同密钥。
现在我想加入这两个表,其中表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年或更长的日期。
答案 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;