Join Now

Fra forløbsdatabase til snapshottabel

by Contributor SanderEhmsen on ‎12-02-2015 06:48 AM (355 Views)

Hej community

 

Jeg er i gang med at tilrettelægge CVR-data. Her løber jeg ind i, at mine evner mest rækker til lidt for tunge løsninger.

 

Sagen er den, at jeg har en forløbsdatabase a la 

CVRnummer Adresse_ID Tid_fra Tid_til
10000025 1 13OCT1999:00:00:00.000 10OCT2007:00:00:00.000
10000025 2 11OCT2007:00:00:00.000 .
10000068 5 18OCT1999:00:00:00.000 20DEC2001:00:00:00.000
10000106 6 11JUL1985:00:00:00.000 30JUN2007:00:00:00.000
10000122 10 22FEB2000:00:00:00.000 15AUG2002:00:00:00.000

 

Jeg vil gerne have det over på en såkaldt snapshottabel, så det er nemt for mine slutbrugere at lave opgørelser på månedsniveau.

Jeg vil derfor gerne have en tabel a la:

  Snapshot_dato Adresse
10000025 31-okt-99 1
10000025 30-nov-99 1
10000025 31-dec-99 1
10000025 31-jan-00 1
10000025 29-feb-00 1
10000025 31-mar-00 1

 

Jeg har lavet en tabel, der indeholder alle sidste dage i månederne. Den ser altså således ud: 

Snapshotdato aarmd
31-01-2005 200501
28-02-2005 200502
31-03-2005 200503
30-04-2005 200504

 

 

Jeg har rigtig mange tabeller indeholdende forskellige felter liggende, men vil gerne lave en analysetabel, som er nem for slutbrugerne at arbejde videre med. 

 

Min første tanke var at lave et simpelt (godt nok fuzzy) sql-join, hvor tid_fra<=snapshot_dato<=tid_til.

Men det kommer til at tage lang tid at køre.

 

Min tanke var derfor, om der var andre muligheder. Jeg kunne jo bruge tid på at forstå Simon Daniel Eirikssons indlæg fra SAS-Forum, men måske der var oplagte nemmere løsninger? 

Comments
by SAS Employee GertNissen
‎12-04-2015 06:49 AM - edited ‎12-04-2015 10:12 AM

Muligvis misforstår jeg din udfordring, men jeg har lavet denne mock-up kode, som måske kan hjælpe lidt på vej. 

 

Jeg har taget udgangspunkt i din Forløbstabel og nedenstående kode 'laver' alle de mellemliggende måneder mellem fradato og tildato som enkelt rækker.

 

Der er ingen kommentarer i koden, så spørg endelig hvis der er noget.......

 

data test(keep=CVRnummer Adresse_ID Snapshot_dato i);
  set work.sander(keep=CVRnummer Adresse_ID Tid_fra Tid_til);
  format Snapshot_dato tidfra tidtil date.;
  tidfra = datepart(input(Tid_fra,datetime.));
  tidtil = datepart(input(Tid_til,datetime.));
  if tidtil = . then tidtil = intnx('month',today(),-1,'END');
  mdint = intck('month',tidfra,tidtil);
  do i = 0 to mdint;
    Snapshot_dato = intnx('month',tidfra,i,'END');
	output;
  end;
run;

(PS: det er bare hurtigt kastet sammen, så der kan formentlig ryddes lidt osv. - det er mere ideen...)

 

Output:
SAS Snapshot output.png

by Contributor SanderEhmsen
on ‎12-11-2015 03:15 AM

Hej Gert

 

Du forstod fuldstændig, hvad jeg ville. Så tak for din hjælp!

 

Dit svar gør det ønskede. Desværre var data ikke helt så stringent, som jeg gav udtryk for i mit spørgsmål. Men med lidt transformering lykkedes det alligevel at få data til at passe til loopet. 

 

I øvrigt er det mit første loop. Men det er godt nok et kraftfuldt og simpelt værktøj. Så tak for hjælpen på flere planer!