2014-05-29 5 views
1

У меня есть следующие данные:SAS - Сравните наблюдения с предыдущими наблюдениями?

acct  date 
11111  01/01/2014 
11111  01/01/2014 
11111  02/02/2014 
22222  01/01/2014 
22222  01/01/2014 
33333  01/01/2013 
33333  03/03/2014 
44444  01/01/2014 
44444  01/01/2014 
44444  01/01/2014 

Что бы быть лучшим способом для достижения следующих в SAS? Я хочу сравнить даты для каждого номера acct и вернуть все записи для accts, где есть хотя бы одна дата, которая не соответствует.

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

acct  date 
11111  01/01/2014 
11111  01/01/2014 
11111  02/02/2014 
33333  01/01/2013 
33333  03/03/2014 
+0

Вы имеете в виду возвратить все строки учетных записей, в которых есть одна запись, не дублированная в день? – Keni

+0

Да, я думаю, что это может быть лучший способ рассказать об этом. – user2941280

ответ

1

Что-то, как это будет работать. Сортируйте данные по acct/date, если они еще не были, а затем проверьте каждую строку last.date. Если первая строка last.date не является также last.acct, то это набор строк, в которых необходимо вывести ответчика. Здесь я только выход один ряд в комбинации даты/учетный:

data want; 
set have; 
by acct date; 
if (last.date) and not (last.acct) then do; 
    flg=1; 
    output; 
end; 
else if last.date and flg=1 then output; 
else if first.acct then flg=0; 
run; 

Если вам нужны все строки, то вам необходимо либо взять выше, и объединить его обратно к оригиналу, или вы могли бы сделать петлю DOW:

data want; 
do _n_=1 by 1 until (last.acct); 
set have; 
by acct date; 
if (last.date) and not (last.acct) then do; 
    flg=1; 
end; 
end; 
do _t_ = 1 by 1 until (last.acct); 
set have; 
by acct date; 
if flg=1 then output; 
end; 
run; 
+0

Это работает ... спасибо. – user2941280

+0

Хороший ответ, но я думаю, что '_n_ = 1 на 1' избыточен здесь, поскольку вы фактически не используете' _n_' в своем цикле DoW. Вы могли бы просто написать 'do до (last.acct);' и это будет работать нормально. – user667489

+0

Возможно, это традиционно, поэтому я оставляю это :) – Joe

2

Один PROC SQL сделает трюк. Используйте счетчик (отличная дата), чтобы подсчитать количество разных дат. Группируйте, чтобы acct выполнял подсчет по acct, а когда результат был больше 1 фильтра, он использовал предложение having. Затем выберите acct и дату как выходные столбцы.

Это специальная обработка SQL-запросов SAS. Большинство других реализаций не позволят этой конструкции, где вы не помещаете все неагрегатные столбцы из выбора в разделе group by.

proc sql noprint; 
    create table _output as 
    select acct, date format=ddmmyys10. 
    from _input 
    group by acct 
    having count(distinct date) > 1 
    order by acct, date; 
    quit; 
+0

Отличный ответ! У меня был ответ, похожий на @ Joe's, но я просто знал, что с Proc SQL будет более плавный путь (хотя я не мог на него наложить). – rambles