根据重叠日期创建数据集

Creating datasets based on overlapping dates

我有一个包含 window 开始和结束日期的数据集。对于一个帐户,可能有多个案例,每个案例都有单独的 window 开始日期和结束日期。我想创建两个数据集,一个案例有重叠 window 开始和结束日期,另一个没有重叠案例。

我拥有的数据集

 input acct_num case window_start window_end ;
    DATALINES; 
    55203610 1  10JAN2020 23FEB2020
    55203610 2  17JAN2020 13MAR2020
    55203610 3  31DEC2019 17MAR2020
    55203612 1  22FEB2021 09JUN2021  
    55203612 2  27AUG2021 31DEC2021
    55203614 1  11FEB2018 21MAR2018
    55203614 2  14MAR2018 23JUL2018
    ;
    run;

我想要的数据集。

overlapping dataset 

    55203610 1  10JAN2020 23FEB2020
    55203610 2  17JAN2020 13MAR2020
    55203610 3  31DEC2019 17MAR2020
    55203614 1  11FEB2018 21MAR2018
    55203614 2  14MAR2018 23JUL2018

Non overlapping dataset

    55203612 1  22FEB2021 09JUN2021  
    55203612 2  27AUG2021 31DEC2021

所以,如果您看到重叠数据集包含日期重叠的案例帐户。

任何帮助将不胜感激。

根据您的数据集,这是可行的。

  • 识别初始数据集中的重叠并创建一个标志
  • 根据任何具有重叠标志的 ID 过滤数据集
  • 根据具有重叠标志的任何 ID 的倒数过滤数据集

data have;
    infile cards;
    input acct_num case window_start : date9. window_end : date9.;
    format window_: date9.;
    cards;
55203610 1  10JAN2020 23FEB2020
55203610 2  17JAN2020 13MAR2020
55203610 3  31DEC2019 17MAR2020
55203612 1  22FEB2021 09JUN2021  
55203612 2  27AUG2021 31DEC2021
55203614 1  11FEB2018 21MAR2018
55203614 2  14MAR2018 23JUL2018
    ;
run;
data check;
    set have;
    by acct_num;
    prev_start=lag(window_start);
    prev_end=lag(window_end);

    if not first.acct_num and prev_start<window_start<prev_end then
        overlap=1;
run;

proc sql;
    create table want_overlap as select * from have where acct_num in (select 
        distinct acct_num from check where overlap=1);
quit;

proc sql;
    create table want_no_overlap as select * from have where acct_num not 
        in (select distinct acct_num from check where overlap=1);
quit;