Proc sql добавить колонку для заказа победителей - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужна ваша помощь, у меня есть упражнение, в котором просим определить победителей по общему количеству медалей, если количество медалей одинаково для двух стран, то мне нужно сравнить по 3 столбцу по порядку (которые являются типами медалей).)

, поэтому у меня есть

sum(3columns) as total
order total desc, col1 desc , col2 desc , col3 desc

, затем я сохранил его в виде таблицы и добавил монотонное () как место победителя (1 2 3 4 ...), но у меня есть 3 команды, которые имеюттот же общий результат и одно и то же значение в 3 столбцах, поэтому они должны быть помещены во все 25, но я изо всех сил пытаюсь это сделать.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Используйте first. оценку последней переменной в группе by, чтобы определить, когда увеличивать общее значение ранга.

* sample data;
data have (keep=eventid teamid medal);
  length eventid teamid 8 medal $8;
  do eventid = 1 to 75;
    g = ceil(100 * ranuni(123));
    do until (s ne g);
      s = ceil(100 * ranuni(123));
    end;
    do until (b ne g and b ne s);
      b = ceil(100 * ranuni(123));
    end;

    teamid = g; medal = 'gold'; output;
    teamid = s; medal = 'silver'; output;
    teamid = b; medal = 'bronze'; output;
  end;
run;

* compute medal count for each team;    
proc summary noprint data=have ;
  class teamid medal;
  ways 2;
  output out=stage2(drop=_type_);
run;

* pivot categorical medal counts into wide form;
proc transpose data=stage2 out=stage3(drop=_name_);
  by teamid;
  var _freq_;
  id medal;
run;

* compute each medaling teams total medal count;
data stage4;
  retain teamid total gold silver bronze; * sets order of variables in pdv;
  set stage3;
  total = sum (gold, silver, bronze);
run;

* sort descendingly by total and medal quality in preparation of rank assignment;
proc sort data=stage4;
  by descending total descending gold descending silver descending bronze;
run;

* assign dense rank;
data want;
  set stage4;
  by descending total descending gold descending silver descending bronze;

  if first.bronze then /* new combination detected */
    overall_rank + 1;
run;
0 голосов
/ 10 декабря 2018

Сортируйте данные правильно, а затем используйте групповую обработку FIRST / LAST / BY.

proc sort data = have;
    by descending Total_Medals descending Gold descending Silver descending Bronze;
run;

data want; 
 set have;

 by descending Total_Medals descending Gold descending Silver descending Bronze;

 Rank = _n_;
run;
...