Подсчет записей проход за полночь - PullRequest
0 голосов
/ 31 января 2020

У меня есть два набора данных:

1) Давайте назовем первый набор данных - «Провайдер». Он содержит годовой список поставщиков (более 3900 смен / записей), дату, с которой они работали в смену, и тип смены. Обратите внимание, что существуют типы смен, которые охватывают полночь.

          Date             Provider        Shift
          1/8/2019           Bob           ED A/B 11p-7a (ED A/B)
          1/10/2019          Bob           ED C/D 11p-7a (ED C/D)
          1/16/2019          Bob           ED C 3p-12a (ED C)
          1/9/2019           Sue           UMC 5p-2a (UMC)
          1/11/2019          Bob           ED C/D 11p-7a (ED C/D)
          1/13/2019          Bob           ED PH/night 10p-4a (ED PH/night)

2) У меня есть другой набор данных - «Пациенты». Он содержит сумму FIN за год, дату / время, когда они видели поставщика, и название поставщика, которого они видели, всех пациентов, которых видели у нас.

            FIN        Date               Provider Name
             1      1/8/2019 23:40           Bob 
             2      1/9/2019 01:46           Timbo
             3      1/9/2019 01:30           Bob
             4      1/9/2019 05:06           Patty
             5      1/9/2019 02:50           Bob
             6      1/9/2019 17:23           Sue
             7      1/9/2019 06:45           Mike
             8      1/10/2019 01:35          Sue

Я собираюсь создать новый набор данных, который будет содержать количество пациентов, которых видели в течение данной смены.

Так, например, набор данных будет выглядеть следующим образом:

             Shift date    Shift                         FIN             Provider 
              1/8/2019     ED A/B 11p-7a (ED A/B)         1                Bob
              1/8/2019     ED A/B 11p-7a (ED A/B)         3                Bob
              1/8/2019     ED A/B 11p-7a (ED A/B)         5                Bob
              1/9/2019     UMC 5p-2a (UMC)                6                Sue
              1/9/2019     UMC 5p-2a (UMC)                8                Sue

Я мог бы очень легко создать этот набор данных, объединив два набора данных, затем сопоставив их по дате и имени поставщика; однако, как я упоминал ранее, некоторые сдвиги охватывают более позднюю полночь, поэтому я не могу сопоставить их по дате.

Существует примерно 20 различных типов смен, для которых я заинтересован в сборе данных, из которых 6 охватывают полночь. Мне нужно было бы структурировать мои данные так, чтобы они говорили, что если провайдер работал в смену ED A / B 11p-7a (ED A / B) 8 января 2009 года, то подсчитайте любого пациента, которого он / она также видел до 7 утра 1 / 9/2019? Если возможно, мне нужно было бы создать какой-то макрос (я думаю).

Надеюсь, это имеет смысл - спасибо за помощь!

1 Ответ

2 голосов
/ 01 февраля 2020

Вам потребуется обработать данные Provider для вычисления времени начала и окончания смены. Для этого потребуется найти текст ##p-##a, а также, предположительно, также ##a-##a, ##a-##p и ##p-##p части в Shift.

После вычисления времени смены данные можно объединить следующим образом:

  patients
join 
  provider
on
  patients.date between provider.shift_start and provider.shift_end
& patients.provider = provider.provider

Пример

data provider;
attrib
  date informat=mmddyy10. format=mmddyy10.
  provider length=$10
  shift length=$60
;
input date& provider& shift&; datalines;
1/8/2019     Bob     ED A/B 11p-7a (ED A/B)
1/10/2019    Bob     ED C/D 11p-7a (ED C/D)
1/16/2019    Bob     ED C 3p-12a (ED C)
1/9/2019     Sue     UMC 5p-2a (UMC)
1/11/2019    Bob     ED C/D 11p-7a (ED C/D)
1/13/2019    Bob     ED PH/night 10p-4a (ED PH/night)
1/15/2019    Bob     ED PH/night 10p-9p (ED PH/night)
1/17/2019    Bob     ED PH/night 2-11a (ED PH/night)
;

data patients;
attrib
  fin length=8
  service_dt length=8 format=datetime20. informat=anydtdtm20.
  provider length=$10
;
input FIN&  service_dt&  Provider&; datalines;
1   1/8/2019 23:40     Bob 
2   1/9/2019 01:46     Timbo
3   1/9/2019 01:30     Bob
4   1/9/2019 05:06     Patty
5   1/9/2019 02:50     Bob
6   1/9/2019 17:23     Sue
7   1/9/2019 06:45     Mike
8   1/10/2019 01:35    Sue
;

* compute shift start and end datetimes;
* presume the shift time ranges are valid;
* this example does not deal with start and ends at noon or midnight; 
data provider_range;
  set provider;

  rxid = prxparse('/(\d{1,2})(a|p)-(\d{1,2})(a|p)/');

  if prxmatch(rxid,shift) then do;
    length t1 $2 p1 $1 t2 $2 p2 $1;
    t1 = prxposn(rxid,1,shift);  t1n=input(t1,2.);
    p1 = prxposn(rxid,2,shift);
    t2 = prxposn(rxid,3,shift);  t2n=input(t2,2.);
    p2 = prxposn(rxid,4,shift);

    select (p1||p2);
      when ('aa', 'pp') do;
              shift_start = dhms(date, t1n+12*(p2='p'),0,0);
              shift_end   = dhms(date, t2n+12*(p2='p'),0,0);
            end;
      when ('ap') do;
              shift_start = dhms(date, t1n+0,0,0);
              shift_end   = dhms(date, t2n+12,0,0);
            end;
      otherwise /* pa */ do;
              shift_start = dhms(date, t1n+12,0,0);
              shift_end   = dhms(date, t2n+24,0,0);
            end;
    end;
  end;
  else do;
    put 'ERROR: Invalid shift, '  shift ;
    delete;
  end;

  format shift_start shift_end datetime20.;
  drop rxid t1: p1: t2: p2:;
run;

* this join does not use SAS SQL BETWEEN, the join criteria 
* uses explicit construct  a <= b and b <= c instead;

proc sql;
  create table want as
  select 
    provider.date as shift_date,
    provider.shift,
    patients.service_dt,
    patients.fin,
    patients.provider
  from patients
  join provider_range as provider
    on patients.provider = provider.provider and
       provider.shift_start <= patients.service_dt and
       provider.shift_end >= patients.service_dt
  order by
    fin
  ;
quit;
...