Оставить соединение PRO C SQL, используя пороговую дату - PullRequest
0 голосов
/ 29 апреля 2020

Я надеюсь, что вы можете мне помочь! Пожалуйста, помогите !!!!

Я нахожусь в SAS, используя PRO C SQL, и у меня есть наборы данных A и B с различными измерениями (касающимися здоровья пациента) следующим образом:

Набор данных A

ID       Date              measurement_a
1      20JUN2013               52.3
1      12JUL2013               65.6
1      28NOV2014               37.4
1      02DEC2014               61.3
1      22SEP2015               40.5
1      15OCT2015               60.5
2      03JUN2011               46.5 
2      19JUL2011               54.1
2      29OCT2012               53.6
...

Набор данных B

ID       Date              measurement_b
1      21MAR2007               43
1      13JUL2007               45
1      07APR2009               47
1      14MAY2009               46
1      16FEB2012               42
1      27AUG2012               53
1      12DEC2012               58 
1      20JUN2013               56
1      10DEC2013               53
1      23MAY2014               49
1      17SEP2014               44
1      23SEP2015               40
2      16DEC2011               58
2      22AUG2012               54
2      20FEB2013               56
2      29MAY2013               53
...

Я ищу, чтобы дата в наборе данных B находилась в течение 6 месяцев с даты в наборе данных a Затем будет добавлена ​​новая переменная под названием «время», скажем 1,2,3, et c. сколько из них когда-либо совпадает с ** only measure_a ** length (другими словами, мне не нужно сохранять значения measure_b, если оно не соответствует дате в наборе данных a. Вот пример того, что я имею в виду:

Желаемый результат / набор данных:

ID     Time      measurement_a       measurement_b 
1        1             52.3               56 (Dataset B Date = 20JUN2013 - Matched exactly)
1        2             65.6               53 (Dataset B date = 10DEC2013 - Within six months of 12JUL2013 [Dataset A Date])
1        3             37.4               44 (Dataset B date = 17SEP2014 - Within six months of 28NOV2014 [Dataset A Date])
1        4             61.3                . (because 17SEP2014 [Dataset B] is closest to 28NOV2014 [Dataset A])       
1        5             40.5               40 (because 23SEP2015 [Dataset B] is closest to 22SEP2015 [Dataset A])
1        6             60.5                . (No date in Dataset B that is within 6 months of Date in Dataset A [15OCT2015])

2        1             46.5                . (See below)
2        2             54.1               58 (because 03JUL2011 [Dataset B] is closest to 19JUL2011 [Dataset A]) 
2        3             53.6               54 (Dataset B date = 22AUG2012 - Within 6 months of Dataset A date = 29OCT2012)
...

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

PROC SQL;
CREATE TABLE join_test as
SELECT * FROM data_a as a
LEFT_JOIN data_b as b
ON a.id = b.id 
WHERE days(a.Date - b.Date) <= 180 ;
QUIT;

Но это не сработает.

Может ли какой-нибудь пожалуйста помочь мне?

Я действительно ценю это Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2020

В критерии объединения добавьте использование функции SAS INTCK для вычисления количества интервалов месяца между двумя значениями даты. В Pro c SQL нет способа ввести значение серийного счета, поэтому вам придется добавить его на следующем шаге. LEFT JOIN создаст набор результатов с каждым идентификатором / датой в таблице A.

Пример: столбцы a.date, b_date и c_months_apart были добавлены, чтобы показать, как работает объединение. Вы можете безопасно удалить их из вывода select.

proc sql;
  create table stage1 as
  select 
    a.id
  , a.date
  , a.measurement_a
  , b.measurement_b
  , b.date as b_date
  , intck('month', a.date, b.date, 'C') as c_months_apart
  from 
  a left join b 
  on a.id = b.id 
  and intck('month', a.date, b.date, 'C') between 0 and 6
  order by a.id, a.date, b.date
  ;

data want;
  set stage1;
  by id;
  if first.id then time=1; else time+1;
run;

(хотите)

                   measurement_    measurement_                 c_months_
ID         Date          a               b            b_date      apart      time

 1    20JUN2013        52.3             56         20JUN2013        0          1
 1    20JUN2013        52.3             53         10DEC2013        5          2
 1    12JUL2013        65.6             53         10DEC2013        4          3
 1    28NOV2014        37.4              .                 .        .          4
 1    02DEC2014        61.3              .                 .        .          5
 1    22SEP2015        40.5             40         23SEP2015        0          6
 1    15OCT2015        60.5              .                 .        .          7
 2    03JUN2011        46.5             58         16DEC2011        6          1
 2    19JUL2011        54.1             58         16DEC2011        4          2
 2    29OCT2012        53.6             56         20FEB2013        3          3
...