使用SAS的主键

时间:2015-11-05 04:29:16

标签: mysql sql sql-server sas

我希望SAS程序能够根据具有最高速率的线路从数据集中查找主要服务,但是当存在平局时,将第一条线路作为主要线路。请参阅下面的数据集。

ID   line rate  outcome
TTT   1    .95  Primary
TTT   2    .43
RRR   1    .75  Primary
RRR   2    .75
AAA   1    .23
AAA   2    .12
AAA   3    .65  Primary

我创建了两个具有相同数据的表,然后使用以下

使用的代码:

proc sql;
  create table test as
  select a.ID, a.line, a.rate
    (case 
       when ((a.ID = b.ID) and (a.rate ge b.rate)) then "Primary" 
       else ' ' 
    end) as outcome
  from table1 a,table2 b
  where a.ID = b.ID;
quit;

1 个答案:

答案 0 :(得分:0)

这可能不是最佳解决方案,但我建议采用两步法。

  1. 查找每个ID的最大值
  2. 分配主键。使用标志变量来指示max_rate是否是第一次出现。
  3. 这是一个未经测试的示例代码:

        *Calculate max rate per ID;
        proc sql;
        create table temp1 as
        select a.*, max(rate) as max_rate
        from table1
        group by ID
        order by ID, line;
        quit;
    
        *Assign primary key;
        data want;
        set temp1;
    
        by ID;
        retain flag 0;
    
        if first.ID then flag=0;
        if rate=max_rate and flag=0 then do;
           flag=1;
           key='Primary';
         end;
         run;
    
        proc print data=want;
        run; 
    

    另一个选项是使用sort,sort的数据步骤,因此您可以在顶部使用最小行,并使用BY处理将键设置为Primary。

     proc sort data=have;
     by ID descending rate line;
     run;
    
     data want;
     set have;
     by id;
     if first.id then key='Primary';
     run;
    
     proc sort data=want;
     by id line;
     run;
    
    proc print data=want;
    run;