2015-11-05 70 views
0

我想讓一個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; 
+0

您的病例陳述在哪裏?請發佈您的完整代碼。你也沒有指定你想要輸出的樣子。 – Reeza

+0

,你可以包括你的願望結果 –

+1

我認爲「主鍵」在這裏是一個糟糕的詞選擇,因爲這在SQL上下文中有技術含義,似乎並沒有出現在這裏。 – Joe

回答

0

這可能不是最好的解決辦法,但我推薦兩個步驟。

  1. 查找最大爲每個ID
  2. 分配的主鍵。使用標誌變量來指示max_rate是否是第一次出現。

下面是一個未經測試示例代碼:

*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; 

另一種選擇是用那種數據步,排序,所以你必須用最小的線的最大頂部和利用處理設置鍵主。

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; 
+0

謝謝Reeza!我寫了一個類似於第一個代碼的代碼,但是使用了proc方法來獲得最大的速率,行數。 –