Сортировать по минимальному значению каждой группы в порядке возрастания значения в SAS - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь отсортировать по минимальному значению каждой группы значение по возрастанию. Я пробовал несколько разных комбинаций с использованием группировки и сортировки, но не смог отсортировать по группам должным образом. Какой самый эффективный способ?

SAMPLE DATA

Я пробовал это:

PROC SQL;
CREATE TABLE NEED AS 
SELECT DISTINCT *
FROM HAVE
GROUP BY ID,VALUE
ORDER BY VALUE;
QUIT; 

с этим выводом и думал, что это будетсортировка на основе группировки идентификатора

Sample Output

Ответы [ 3 ]

1 голос
/ 21 октября 2019

По умолчанию SQL Procedure реализует автоматическое повторное объединение сводной статистики.

За документацию

Повторное объединение данных

При использовании функции сводки в предложении SELECT или предложении HAVING в журнале SAS может отображаться следующее сообщение:
NOTE: The query requires remerging summary statistics back with the original data.

Процессповторное объединение включает в себя два прохода через данные.

При первом проходе PROC SQL
• вычисляет и возвращает значение функций суммирования. Затем он использует результат для вычисления арифметических выражений, в которых участвует функция итога.
• группирует данные в соответствии с предложением GROUP BY.

На втором проходе PROC SQL извлекает любые дополнительные столбцы и строки, которые необходимо отобразить в выходных данных.

Примечание: Чтобы указать, что PROC SQL не обрабатывает запросы, использующие повторное объединение данных, используйте либо параметр PROC SQL NOREMERGE, либо системный параметр NOSQLREMERGE. Если попытка повторного объединения будет предпринята, когда задан параметр NOMERGE или системный параметр NOSQLREMERGE, в журнал SAS будет записана ошибка.

Запрос, который NOT полагается на автоматическое повторное объединение, будетпохож на следующий пример:

proc sql;
  create table want as 
  select all.* from
  (select make, min(msrp) as lowest from sashelp.cars group by make) as sequencer
  join 
  sashelp.cars as all on sequencer.make = all.make
  order by sequencer.lowest, all.make, all.msrp
  ;

В окне LOG отобразится NOTE в зависимости от того, как используется lowest:

NOTE: The query as specified involves ordering by an item that doesn't appear in its SELECT clause.
0 голосов
/ 20 октября 2019

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

PROC SQL;
CREATE TABLE NEED AS 
  SELECT DISTINCT *,min(value) as min_value
  FROM HAVE
  GROUP BY ID
  order by min_value,id,value
;
QUIT; 
0 голосов
/ 20 октября 2019

Вы можете попробовать простую сортировку:

proc sort data = have out = want;
  by descending ID value;
run;
...