Mapping 在SAS中加入不同范围的电子邮件和日期

Mapping 在SAS中加入不同范围的电子邮件和日期,mapping,sas,Mapping,Sas,我在SAS中有一个通信日志,ComLog,看起来像这样 data ComLog; input mail $ SendDate:date.; format SendDate date.; cards; A@a 27Jan2013 1 A@a 29Jan2013 2 B@b 1Mar2013 3 C@c 3Mar2013 4 ;;;; run; Mail SendDate OpenDate A@a 27Jan 28Jan A

我在SAS中有一个通信日志,ComLog,看起来像这样

data ComLog;
   input mail $ SendDate:date.; 
   format SendDate date.; 
   cards; 
A@a     27Jan2013 1
A@a     29Jan2013 2
B@b     1Mar2013  3
C@c     3Mar2013  4
;;;;
run; 
Mail SendDate OpenDate 
A@a     27Jan  28Jan
A@a     29Jan  30Jan
B@b     1Mar   2Mar
C@c     3Mar   3Mar
我还通过一个外部系统发送一些电子邮件,我试图映射接收者是否打开了电子邮件。BackToComLog文件如下所示

data BackToComLog;
   input mail $ ReadDate:date.; 
   format ReadDate date.; 
   cards; 
A@a     28Jan2013 
A@a     30Jan2013 
B@b     2Mar2013 
C@c     3Mar2013 .
;;;;
run; 
proc sort data=ComLog;
by mail SendDate;
run;

proc sort data=BackToComLog;
by mail ReadDate;
run;


 data want;
  do until (last.mail);
merge ComLog BackToComLog;
by mail;
if first.mail or (range(OpenDate, SendDate) > range(ReadDate, SendDate)) then OpenDate =     ReadDate;
end;
format OpenDate date9.;
drop ReadDate;
run;
   mail  SenDate   OpenDate
   A@a  29JAN13 28JAN2013
   B@b  01MAR13 02MAR2013
   C@c  03MAR13 03MAR2013
现在,我正在尝试左键加入BackToCoMLog返回ComLog。我的最终文件应该是这样的

data ComLog;
   input mail $ SendDate:date.; 
   format SendDate date.; 
   cards; 
A@a     27Jan2013 1
A@a     29Jan2013 2
B@b     1Mar2013  3
C@c     3Mar2013  4
;;;;
run; 
Mail SendDate OpenDate 
A@a     27Jan  28Jan
A@a     29Jan  30Jan
B@b     1Mar   2Mar
C@c     3Mar   3Mar
我试过在这样一个数据步骤中这样做

data BackToComLog;
   input mail $ ReadDate:date.; 
   format ReadDate date.; 
   cards; 
A@a     28Jan2013 
A@a     30Jan2013 
B@b     2Mar2013 
C@c     3Mar2013 .
;;;;
run; 
proc sort data=ComLog;
by mail SendDate;
run;

proc sort data=BackToComLog;
by mail ReadDate;
run;


 data want;
  do until (last.mail);
merge ComLog BackToComLog;
by mail;
if first.mail or (range(OpenDate, SendDate) > range(ReadDate, SendDate)) then OpenDate =     ReadDate;
end;
format OpenDate date9.;
drop ReadDate;
run;
   mail  SenDate   OpenDate
   A@a  29JAN13 28JAN2013
   B@b  01MAR13 02MAR2013
   C@c  03MAR13 03MAR2013
这让我更进一步,但我的最终文件是这样的

data BackToComLog;
   input mail $ ReadDate:date.; 
   format ReadDate date.; 
   cards; 
A@a     28Jan2013 
A@a     30Jan2013 
B@b     2Mar2013 
C@c     3Mar2013 .
;;;;
run; 
proc sort data=ComLog;
by mail SendDate;
run;

proc sort data=BackToComLog;
by mail ReadDate;
run;


 data want;
  do until (last.mail);
merge ComLog BackToComLog;
by mail;
if first.mail or (range(OpenDate, SendDate) > range(ReadDate, SendDate)) then OpenDate =     ReadDate;
end;
format OpenDate date9.;
drop ReadDate;
run;
   mail  SenDate   OpenDate
   A@a  29JAN13 28JAN2013
   B@b  01MAR13 02MAR2013
   C@c  03MAR13 03MAR2013
因此,我的A@a2013年1月27日的日期不在最终文件中,日期也参差不齐。我需要的代码,以能够照顾相同的邮件后,彼此不同的日期

试试这个:

PROC SQL;
CREATE TABLE result_table as
SELECT *
FROM ComLog AS t1
LEFT JOIN BackToComLog AS t2 ON t1.Mail = t2.Mail
WHERE t1.SenDate < t2.OpenDate
;
QUIT;
PROC-SQL;
创建表格结果_表格作为
挑选*
来自ComLog AS t1
在t1.Mail=t2.Mail上以t2的形式左键连接BackToComLog
其中t1.SenDate
我认为您的示例数据太“干净”。如果两者都有呢A@a电子邮件在1月31日打开?或者如果有的话A@a开放日期是1月31日?它适用于哪一种,1月28日还是1月30日?如上所述的问题并不困难,但由于此处提供的信息有限,更现实的问题要复杂得多。