Применение операции к уникальным группам идентификаторов в таблице в SAS?

#sql #group-by #sas

#sql #группировать по #sas

Вопрос:

У меня есть таблица значений, например, ниже. Я хотел бы получить самые последние строки каждого идентификатора кредита. Я могу получить самые последние значения с помощью функции (OBS = 2), но не могу сгруппировать данные для применения каждой операции.

Я искал в Интернете и не могу выполнять циклы do в proc sql. Я также не могу использовать groupby, потому что это просто дает мне сводную статистику. Если бы кто-нибудь мог порекомендовать метод, который можно попробовать, и даже показать мне какой-нибудь псевдокод того, как подойти к проблеме, было бы здорово.

 loan_id Date    princ_amt   del_status
1      1012016  70           0
1      2012016  60           7
1      3012016  50           9
1      4012016  40           9
1      5012016  30           7
1      6012016  20           7
1      7012016  10           1
1      8012016  0            0
1      9012016  0            0
1      10012016 0            0
1      11012016 0            0
1      12012016 0            0
2      1012016  70           0
2      2012016  60           0
2      3012016  50           0
2      4012016  40           1
2      5012016  30           7
2      6012016  20           7
2      7012016  10           8
2      8012016  0            0
2      9012016  0            0
2      10012016 0            0
2      11012016 0            0
2      12012016 0            0
  

Комментарии:

1. какую базу данных вы используете?

Ответ №1:

Если это SAS, используйте шаг данных с by группой.

 data want;
set have;
by loan_id;
retain cnt 0;
if first.loan_id then
   cnt = 0;

cnt = cnt   1;

if cnt <=2 then output;

drop cnt;
run;
  

Мы перебираем данные и подсчитываем количество наблюдений по loan_id . Используется retain для сохранения значения cnt между наблюдениями. Если количество меньше или равно 2, то мы выводим запись.

Ответ №2:

Я полагаю, вам просто нужна ПОСЛЕДНЯЯ строка для каждого loan_id при сортировке по дате в порядке возрастания.

 PROC SORT DATA=dset1; BY loan_id date; RUN;

DATA dset2;
  SET dset1;
  BY loan_id;
  IF LAST.loan_id;
RUN;
  

Комментарии:

1. Это отлично работает! Есть ли какой-либо способ продлить это с самого последнего месяца до самых последних 6 месяцев?

2. Это означало бы несколько строк на loan_id? Если это так, возьмите «dset2» и выполните объединение с «dset1» В a.loan_id=b.loan_id, ГДЕ 0 — файл a.date-файл b.date 180.