Функция SAS и Coalesce для вставки пропущенных значений даты? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть набор данных (VISIT1) дат посещения пациента (PROC1_DT) с датой, предшествующей 90 дням (LOOKBACK_DT). Я присоединился к этому VISIT1 с другой таблицей VISIT2, так что если PROC2_DT находится между PROC1_DT и LOOKBACK_DT, создается новый список.

Однако я хотел бы, чтобы все даты VISIT1 появлялись в окончательном наборе данных, даже если нет PROC2_DT, который находится между PROC1_DT и LOOKBACK_DT. Например, Доктор B и Пациент 5 не отображаются в НАСТОЯЩЕМ НАБОРЕ ФИНАЛЬНЫХ ДАННЫХ, потому что у пациента не было PROC2_DT, который попадал между PROC1_DT и LOOKBACK_DT.

Я пытался использовать COALESE, но я явно не использую его должным образом и / или мне нужен другой метод.

VISIT1
Doctor Patient LOOKBACK_DT PROC1_DT
A      1       28APR2018   27JUL2018
A      2       07MAR2018   05JUN2018
A      3       19JUN2018   17SEP2018
A      4       22MAY2018   20AUG2018
B      5       07FEB2019   08MAY2019
C      6       14JUL2018   12OCT2018
C      7       10APR2018   09JUL2018
C      8       17NOV2018   15FEB2019

proc sql;
  create table final_data_set as
  select distinct 
      a.Doctor 
    , a.Patient 
    , a.LOOKBACK_DT
    , coalesce(b.viisit_dt) as PROC2_DT format=date9.
    , a.PROC1_DT
  from
    VISIT1 a
  left join
    ( select *
      from prvdr_bene_visit
      where _proc2 ge 1
    ) b 
  on a.Patient=b.Patient
  where
    b.VISIT_DT ge a.lookback_dt
    and b.VISIT_DT lt a.PROC1_DT
  group by  
      a.Doctor
    , a.Patient
    , a.PROC1_DT
    , a.lookback_dt
  order by
    a.Doctor
    , a.Patient
    , a.PROC1_DT
  ;
quit;

FINAL_DATA_SET 
Doctor Patient LOOKBACK_DT PROC2_DT   PROC1_DT
A      1       28APR2018   24JUL2018  27JUL2018
A      2       07MAR2018   03JUN2018  05JUN2018
A      3       19JUN2018   07SEP2018  17SEP2018
A      4       22MAY2018   18AUG2018  20AUG2018
C      6       14JUL2018   09OCT2018  12OCT2018
C      7       10APR2018   03JUL2018  09JUL2018
C      8       17NOV2018   28DEC2018  15FEB2019

1 Ответ

1 голос
/ 27 октября 2019
  • Сделайте это действительно ЛЕВЫМ СОЕДИНЕНИЕМ:

Если я правильно понимаю задачу, ваша проблема в том, что вы думаете, что используете ЛЕВОЕ СОЕДИНЕНИЕ, но на самом деле делаете внутреннее соединение. Это связано с тем, что вы добавили условие WHERE, в котором используется столбец из «левой соединенной таблицы» таким образом, что требуется сопоставление записей, что фактически является внутренним соединением.

Чтобы сделать это левым соединением, необходимо выполнитьусловие, предоставленное в WHERE, чтобы быть частью условий JOIN - это здесь так же просто, как изменить WHERE на AND:

on a.Patient=b.Patient
/* where */ and
b.VISIT_DT ge a.lookback_dt
and b.VISIT_DT lt a.PROC1_DT
  • Относительно coalesce используется для даты PROC2_DT - я не уверен, что этотвой план там. Coalesce - это операция на основе строк, которая возвращает первое ненулевое значение из нескольких аргументов, например, coalesce(b.VISIT_DT, a.PROC_DT) as some_date

Это не агрегатная функция, и нет другой агрегатной функциипоэтому предложение GROUP BY не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...