2015-11-05 3 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; 

Другим вариантом является шагом данных с сортировки, сортировки, так что вы имеете максимум с минимальной линией в верхней и использовать ПО обработки, чтобы установить ключ 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; 
+0

Спасибо, Reeza! Я написал код, похожий на первый, но используемый метод proc, чтобы получить максимальную скорость, количество строк. –

Смежные вопросы