SAS proc sql внутреннее соединение без дубликатов - PullRequest
0 голосов
/ 14 мая 2018

Я изо всех сил пытаюсь объединить две таблицы, не создавая дублирующихся строк, используя proc sql (не уверен, что любой другой метод более эффективен).

Внутреннее соединение включено: datepart (table1.date) = datepart (table2.date) AND tag = тег AND ID = ID

Я думаю, что проблема в дате и различных именах в таблице 1. Просто посмотрев, что в таблице ясно, что строка 1 таблицы 1 должна быть объединена со строкой 1 таблицы 2, потому что транзакция началась в 00:04 в таблице 1 и завершилась в 00:06 в таблице 2. У меня возникла проблема: я не могу присоединиться к датам с отметкой времени, поэтому я удаляю отметки времени, и из-за этого создаются дубликаты.

Table1:

id tag    date            amount   name_x
1 23      01JUL2018:00:04  12          smith ltd
1 23      01JUL2018:00:09  12          anna smith



table 2:



id tag  ref   amount   date
1 23   19   12          01JUL2018:00:06:00
1 23   20   12          01JUL2018:00:10:00



Desired output:

id tag    date            amount   name_x       ref
1 23      01JUL2018  12          smith ltd       19
1 23      01JUL2018  12          anna smith      20

Ценю вашу помощь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Если мое понимание верно, вы хотите объединить по идентификатору, тегу и ближайшим двум датам, это означает, что 01JUL2018: 00: 04 в таблице1 является ближайшим с 01JUL2018: 00: 06: 00 в talbe2 и 01JUL2018:00:09 с 01JUL2018: 00: 10: 00, вы можете попробовать это:

data table1;
input id tag date:datetime21.   amount   name_x $15.;
format date datetime21.;
cards;
1 23 01JUL2018:00:04 12 smith ltd
1 23 01JUL2018:00:09 12 anna smith
;

data table2;
input id tag  ref   amount   date: datetime21.;
format date datetime21.;
cards;
1 23 19 12 01JUL2018:00:06:00
1 23 20 12 01JUL2018:00:10:00
;


proc sql;
   select a.*,b.ref from table1 a inner join table2 b
   on a.id=b.id and a.tag=b.tag
   group by a.id,a.tag,a.date
   having abs(a.date-b.date)=min(abs(a.date-b.date));
quit;
0 голосов
/ 14 мая 2018

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

Кроме того, это плохой дизайн базы данных с чьей-то стороны ...

Давайте сначала отсортируем table2 по id, tag и date

proc sort data=table2 out=temp;
by id tag date;
run;

Теперь напишите шаг данных, чтобы добавить предыдущую дату для уникальных id/tag комбинаций.

data temp;
set temp;
format low_date datetime20.
by id tag;
retain p_date;

if first.tag then
   p_date = 0;

low_date = p_date;
p_date = date;
run;

Теперь обновите ваше объединение, чтобы использовать диапазон дат.

proc sql noprint;
create table want as
select a.id, a.tag, a.date, a.amount, a.name_x, b.ref
from table1 as a
  inner join
     temp as b
  on a.id = b.id
  and a.tag = b.tag
  and b.low_date < a.date <= b.date;
quit;
...