Возвращает наблюдение с самой последней датой в каждой группе

#sas #proc-sql

#sas #proc-sql

Вопрос:

Я попробовал следующий код и, к сожалению, он выборочно проверен в нескольких местах, но не во всех.

 proc sql;
create table AgedPrep AS
SELECT * , MAX(report_date) AS Latest_dt format date9.
FROM WORK.What_We_Have 
GROUP BY Name 
;
quit;


proc sql;
create table Aged_Want AS
SELECT * 
FROM WORK.AgedPrep
Where Latest_dt = report_date
;
quit;
  

У нас есть следующие данные

   Name  Report_Date  Outcome
  Brian  11/12/13    good
  Brian  11/14/14    bad
  sussie  9/12/20    good
  sussie  12/11/19   bad
  

мы хотим следующее

   Name  Report_Date  Outcome
  Brian  11/14/14    bad
  sussie  9/12/20    good
  

Довольно классический выбор только строки с самой последней датой для каждой группы. Я понял это правильно раньше, но, похоже, не могу понять это сейчас.

Заранее спасибо за любую помощь

Ответ №1:

Вот простая версия, использующая базовый код SAS.

 proc sort data=have;
   by name descending report_date;

data want;
   set have;
   by name;
   if first.name;
run;


  

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

1. вау, я не знаю, почему я так зациклился на желании использовать proc SQL и функцию max(). Я пытался избежать перемещения, когда люди присоединяют таблицу к самой себе. Теперь я немного смущен.

Ответ №2:

Используйте having предложение и автоматическое повторное объединение SAS SQL. наличие логики будет применяться по группе, когда есть GROUP BY

Пример:

   create table want AS
  SELECT *
  from have
  group by name
  having report_date = max(report_date)