2015-04-13 3 views
0

Привет, мне было интересно, как бы вы написали этот код в PROC SQL против data step, который я написал ниже. Я пытаюсь уменьшить код, данные изначально находятся в текстовом файле, к сожалению, время datetime, когда оно было изменено на CHAR (мастер импорта), представляет собой длину 9 vs 8 (вычисляемый столбец), которая является значением по умолчанию, поэтому я меняю ее на первый шаг данных. В конечном итоге я получаю результаты, которые хочу получить, но я хотел бы узнать, может ли SQL предоставить более эффективное решение.SAS Datetime Proc SQL

data WORK.CNE_RESI; 
    SET WORK.cneres_41; 
    FORMAT RPTDATE_2 $CHAR9.; 
    IF rptdate = '1/5/2015' THEN RPTDATE_2 = '1/9/2015'; 
    ELSE IF RPTDATE_2 = "" THEN RPTDATE_2=rptdate ; 
RUN; 

data WORK.CNE_RESI_2; 
    SET WORK.CNE_RESI; 
    FORMAT RPTDATE_3 MMDDYY10.; 
    RPTDATE = input(RPTDATE_2, MMDDYY10.); 
RUN; 
+2

Я бы исправить импорт из текстового файла первого и я предполагаю, что вы нуждались бы в CHAR10, 12/31/2015 бы 10 символов? В любом случае вы должны импортировать его непосредственно в качестве значения даты. – Reeza

+0

Является ли RPTDATE_2 новой переменной или она уже существует в наборе данных cneres_41? –

ответ

1

Не уверен, что это правильный способ сделать это, но я пошел.

%let olddate = 1/5/2015; 
%let newdate = 1/9/2015; 


proc sql; 

create table WORK.CNE_RESI_2 as 
select a.*, 
case when rptdate = "&olddate" then "&newdate" 
else rptdate 
end as RPTDATE_2 format=$char9., 
input(case when rptdate = "&olddate" then "&newdate" 
else rptdate 
end,mmddyy10.) as RPTDATE_3 format=mmddyy10. 
from WORK.cneres_41 a; 
quit; 

Конечно, если вы на самом деле не нужна переменная rptdate_2 и просто с помощью, чтобы изменить формат, то это должно работать.

proc sql; 
    create table WORK.CNE_RESI_2 as 
    select a.*, 
    input(case when rptdate = "&olddate" then "&newdate" 
      else rptdate 
      end,mmddyy10.) as RPTDATE_3 format=mmddyy10. 
from WORK.cneres_41 a; 
quit; 
+0

Это сработало спасибо большое! – Alex

0

Ваш окончательный вопрос:

я в конечном итоге получить результаты, я хочу, но я хотел бы видеть, если SQL может обеспечить более эффективное решение.

Причина, по которой ваши шаги DATA кажутся неэффективными, заключается в том, что вы делаете два полных прохода над данными. В этом случае нет причин для этого, и один шаг DATA, по-видимому, будет по крайней мере столь же эффективным, как SQL для вашего примера. Кроме того, размещение инструкции format над оператором set будет переопределять длину rptdate без необходимости в промежуточной переменной. С этими мыслями, ваш два шага DATA может быть более эффективно, как написано:

data WORK.CNE_RESI; 
    format rptdate $char10. rptdate_n mmddyy10.; 
    set WORK.cneres_41; 

    if rptdate = '1/05/2015' then rptdate = '1/09/2015'; 
    rptdate_n = input(rptdate, ?? MMDDYY10.); 
run; 
+0

Я вижу, спасибо Мэтью за вход! – Alex