Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 注册日期特定日期前后12个月_Date_Sas_Subset - Fatal编程技术网

Date 注册日期特定日期前后12个月

Date 注册日期特定日期前后12个月,date,sas,subset,Date,Sas,Subset,我试图通过id查找在住院日期前12个月和住院日期后12个月连续注册的人员。每个成员将有一行。 这是在美国使用索赔数据库。感谢您的帮助。 数据集示例: ID登记日期结束日期住院日期 1 1/5/2004 1/6/2008 2/2/2006 2.等等 3. 4. id开始\u e结束\u e日期\u h 1 1/1/2005 1/1/2006 2/8/2008 1 2/3/2006 4/5/2013 2 5/7/2005 8/8/2006 4/5/2007 2 1/1/2007 2

我试图通过id查找在住院日期前12个月和住院日期后12个月连续注册的人员。每个成员将有一行。 这是在美国使用索赔数据库。感谢您的帮助。 数据集示例: ID登记日期结束日期住院日期 1 1/5/2004 1/6/2008 2/2/2006 2.等等 3. 4. id开始\u e结束\u e日期\u h 1 1/1/2005 1/1/2006 2/8/2008 1 2/3/2006 4/5/2013 2 5/7/2005 8/8/2006 4/5/2007 2 1/1/2007 2/2/2012 3 5/9/2005 5/9/2007 1/1/2007
3 6/4/2008 7/7/2012

假设我最后的评论有答案,有很多方法可以做到这一点。一开始可能很难让外部连接、交叉连接等以易于理解的方式工作。使用SAS宏,我们可以将问题分解,以便易于理解并进行任何必要的调试。以下是一种可能适合您的方法:

%macro hdates;                                                                                                                        

 /* get number of hosp_dates    */                                                                                                                              
  proc sql noprint;                                                                                                                     
  select count(*) into: cnt                                                                                                             
  from date where hosp_date ne .;                                                                                                       
  quit;                                                                                                                                 

  %let cnt = &cnt;                                                                                                                      


  /* place hdates and ids into macro vars */                                                                                                                                  
  proc sql noprint;                                                                                                                     
  select  enrolid, hosp_date into: id_1 - :id_&cnt, : hdate_1 - :hdate_&cnt                                                             
  from date;                                                                                                                            
  quit;                                                                                                                                 

  proc delete data= hcov; run;                                                                                                          

  /* for each hdate id pair go through the dataset and test for 12 mo coverage                                                                                                                                 
  %do i = 1 %to &cnt;                                                                                                                   

  data new;                                                                                                                             
  set date;                                                                                                                             
  if (enrolid = &&id_&i) then do;                                                                                                       
      preDays = "&&hdate_&i"d - start_date ;                                                                                            
      postDays = end_date - "&&hdate_&i"d;                                                                                              
     if (preDays >= 365 and postDays >= 365) then output;                                                                              
  end;                                                                                                                                  
  run;                                                                                                                                  

  proc append base = hcov data=new;run;                                                                                                 

  %end;                                                                                                                                 






 %mend hdates;                                                                                                                         

 %hdates;                                                                                                                              

我从事索赔数据的工作,我想我理解你想问的问题。我建议在一张表中列出“精简”的登记范围,在另一张表中列出住院日期。然后您可以将它们合并在一起,只保留符合您标准的患者。以下代码将压缩注册范围(假设记录良好):

PROC SORT DATA=dset_in;按id enr_日期结束日期;跑
数据注册(KEEP=id注册\u开始注册\u停止);
设置dset_in;
格式化注册开始注册停止日期9。;
按id enr_日期结束日期;
保留注册\u开始注册\u停止;
如果是第一个,那么就做;
注册开始=注册日期;
注册\停止=结束\日期;
结束;

否则,如果enr_日期-注册站您只是查看以下信息:hosp日期-enr_日期>12个月和结束日期-hosp_日期>12个月?是的,但我希望连续注册而不中断服务。还有一些患者有多行。所以他们可以有不同的注册期。你需要更好地提问。如何不中断服务和多行发挥作用?如果您能显示完整的数据集和对问题的更好描述,请查看顶部的链接。一个患者可以有多个登记行,因为他们可能有2个月的覆盖率,然后是覆盖率差距。然后,他们可以开始另一个具有不同开始和结束日期的注册。我所说的不中断服务的意思是存在覆盖范围缺口。如果你看一下我发布的示例,那么只应该包括患者2。非常感谢您的帮助。请键入您的数据并将其包含在问题中,它为人们提供了一些可供使用的信息。此时要处理您的数据,我必须将其打印出来。您可以通过sql和日期使用自联接来生成解决方案。入学问题是一个常见的问题。在lexjansen.com或communities.sas.com上搜索许多类似的问题和答案。谢谢Dave和DCR。因为我正在处理索赔数据库,第二个答案最符合我的数据,它成功了!感激
PROC SORT DATA=dset_in; BY id enr_date end_date; RUN;

DATA enrollment (KEEP=id enroll_start enroll_stop);
    SET dset_in;
    FORMAT enroll_start enroll_stop DATE9.;
    BY id enr_date end_date;
    RETAIN enroll_start enroll_stop;
    IF first.id THEN DO;
        enroll_start=enr_date;
        enroll_stop=end_date;
    END;
    ELSE IF enr_date-enroll_stop <= 1 THEN enroll_stop=end_date;
    ELSE DO;
        OUTPUT;
        enroll_start=enr_date;
        enroll_stop=end_date;
    END;
    IF last.id THEN OUTPUT;
RUN;
PROC SQL;
  CREATE TABLE hosp_enrolled AS
  SELECT DISTINCT a.id, a.hosp_dt, b.enroll_start, b.enroll_stop
  FROM hosp_claims AS a, enrollment AS b
  WHERE a.id=b.id AND b.enroll_start+365 <= a.hosp_dt <= enroll_stop-365;
QUIT;