2016-07-26 3 views
0

Я пытаюсь сортировать данные из двух таблиц, которые замыкают дату закрытия из таблицы 1 с ближайшей датой из таблицы 2 (если существует). Там могут быть ID-даты из таблицы 1, которые не соответствуют в таблице 2 и наоборот. Не гарантируется также соответствие 1: 1. Для, например, было бы мои данные t1 что-то вроде:SAS-Создать уникальные встречи на основе минимальной разницы в датах

ID time1 
A 01/09/2015 
A 02/16/2015 
B 03/03/2015 
C 04/01/2015 
C 01/20/2015 
C 03/15/2015 

t2 аналогично:

ID time2 
A 01/29/2015 
A 02/19/2015 
B 03/06/2015 
C 01/27/2015 
C 03/18/2015 
C 04/04/2015 

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

desired_output:

ID date_time1 date_time2 
A 01/09/2015 01/29/2015 
A 02/16/2015 02/19/2015 
B 03/03/2015 03/06/2015 
C 01/20/2015 01/27/2015 
C 03/15/2015 03/18/2015 
C 04/01/2015 04/04/2015 

Я не знаю, как это сделать, я попытался выбрать максимум и минимум, но это только дает что-то подобное, что не то, что я хочу:

ID date_time1 date_time2 
A 01/09/2015 02/19/2015 
B 03/03/2015 03/06/2015 
C 01/20/2015 04/04/2015 

Любые идеи/предложения о том, как это сделать, будут очень признательны! Спасибо!

ответ

1

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

data t1 (keep = id date rename = date = time1); 
    set sasuser.admitjune; 
    if mod(_n_, 2) = 0 then id = "A"; 
     else id = "B"; 
run; 

data t2 (keep = id date rename = date = time2); 
    set sasuser.admitjune; 
    if mod(_n_, 2) = 0 then id = "B"; 
     else id = "A"; 
    date = date + 3; /*adjusting the dates so the datasets aren't the same*/ 
run; 

Чтобы сделать это, вы сортировать по возрастанию разница в датах и ​​nodup держать только ближе всего один:

proc sql; 
    create table desired_output as select 
     a.id, a.time1, b.time2 as nearest_time2, 
     abs(b.time2-a.time1) as diff 
     from t1 as a 
     left join t2 as b 
     on a.id = b.id and b.time2 > a.time1 
     group by a.id, a.time1 
     order by calculated diff; 
    proc sort nodupkey; by id time1; 
quit; 
+0

Вы могли бы хотеть к 'и b.time2> a.time1' к вашему чтобы условие 'time2' было после события' time1'. –

+0

Я немного изменил описание, потому что думаю, что было непонятно, что я пытался. Я пытаюсь сортировать данные из двух таблиц, которые связывают дату закрытия из таблицы 1 с ближайшей датой из таблицы 2 (если существует). Но это хорошее дополнение Chris J. – Brad

+0

Итак, ближе всего вы хотите, чтобы ближайшая * следующая * дата (т. Е. Дата2 ДОЛЖНА быть позже даты1)? – superfluous