2016-04-28 15 views
0

Betrachten Sie das folgende SAS-Code:SAS: Gruppe mit von in proc sql trennen Instanzen nicht chronologisch

data test; 
    format dt date9. 
      ctry_cd $2. 
      sn $2.; 
    input ctry_cd sn dt; 
    datalines; 
    US 1 20000 
    US 1 20001 
    US 1 20002 
    CA 1 20003 
    CA 1 20004 
    US 1 20005 
    US 1 20006 
    US 1 20007 
    ES 2 20001 
    ES 2 20002 
    ; 
run; 

proc sql; 
    create table check as 
    select 
     sn, 
     ctry_cd, 
     min(dt) as begin_dt format date9., 
     max(dt) as end_dt format date9. 
    from test 
    group by sn, ctry_cd; 
quit; 

Das gibt:

1 CA 07OCT2014 08OCT2014 
1 US 04OCT2014 11OCT2014 
2 ES 05OCT2014 06OCT2014 

ich für die proc sql zwischen dem unterscheiden möchte Land bewegt sich; das heißt, das Rück

1 US 04OCT2014 06OCT2014 
1 CA 07OCT2014 08OCT2014 
1 US 09OCT2014 11OCT2014 
2 ES 05OCT2014 06OCT2014 

So ist es immer noch Gruppen die Instanzen von sn und ctry_nm aber achtet auf das Datum, so habe ich eine Zeitleiste.

Antwort

1

Sie müssen dann eine andere Gruppenvariable erstellen:

data test; 
    set test; 
    prev_ctry_cd=lag(ctry_cd); 
    if prev_ctry_cd ^= ctry_cd then group+1; 
run; 

proc sql; 
    create table check as 
    select 
     sn, 
     ctry_cd, 
     min(dt) as begin_dt format date9., 
     max(dt) as end_dt format date9. 
    from test 
    group by group, sn, ctry_cd 
    order by group; 
quit; 
0

Wenn die Daten nach Ihrem Beispiel sortiert ist, dann können Sie Ihr Ziel in einem Datum Schritt erreichen, ohne dass eine zusätzliche Variable zu schaffen.

data want; 
keep sn ctry_cd begin_dt end_dt; /* keeps required variables and sets variable order */ 
set test; 
by sn ctry_cd notsorted; /* notsorted option needed as ctry_cd is not in order */ 
retain begin_dt; /* retains value until needed */ 
if first.ctry_cd then begin_dt=dt; /* store first date for each new ctry_cd */ 
if last.ctry_cd then do; 
    end_dt=dt; /* store last date for each new ctry_cd */ 
    output; /* output result */ 
end; 
format begin_dt end_dt date9.; 
run;