Условный выбор в SAS

#sql #sas

#sql #sas

Вопрос:

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

Диаграмма 1

 A       B       C

501     1       O

502     1       K

503     1       V

501     2       Y

502     2       U

504     1       I
  

Диаграмма 2

 A       B       C

503     1       V

501     2       Y

502     2       U

504     1       I
  

О чем я сейчас думаю, так это:

 PROC SQL;
CREATE TABLE CHART2 AS
SELECT
C.COLUMNA,
C.COLUMNC
FROM CHART1 C;
QUIT;
  

Я не уверен, как сказать, что при наличии повторяющихся строк в columnA выберите только те строки, в которых ColumnB имеет максимальное число. Форматирование таблицы немного странное. Я надеюсь, вы поняли мою точку зрения.

Ответ №1:

Одним из вариантов является использование having предложения in proc sql . Думайте об этом как о фильтре, который применяется после выполнения любых группировок.

 proc sql noprint;
  create table want as
  select *
  from sashelp.class
  group by sex
  having age = max(age)
  ;
quit;
  

В приведенном выше коде мы сохраняем строки, в которых значение возраста в строке равно максимальному возрасту ( max(age) ) для этого пола (поскольку мы группируем по полу).

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

Без дополнительной информации о ваших данных я не могу быть уверен, что это будет точно соответствовать вашим потребностям, но это возможно.

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

1. Вы правы! Большое вам спасибо! Я использовал max в предложении select, которое выглядит как select columnA, max(coumnB) из группы chart1 по columnA. Однако это работает только тогда, когда я не включаю ColumnC в выделение.

Ответ №2:

Вы можете попробовать это:

 PROC SORT data = Chart1;
  by A descending B;
RUN;

DATA Chart2;
  set Chart1;
  by A;
  if first.A then output;
RUN;
  

На первом шаге данные сортируются в порядке возрастания A, а затем в порядке убывания B. На втором шаге сохраняется только первая строка для каждого значения A.