#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.