Hallo @Alostcause,
interessante Fragestellung 🙂
Die Fragen 1 und zwei sind ja recht leicht zu beantworten - hier möchte ich nicht darauf eingehen.
Zu Frage 3 und 4 möchte ich noch einen anderen Ansatz bieten.
Für mich relevant ist nun zu wissen:
1. Wie viele Monate Leistung a/b/c/d .... insgesamt einzeln von allen Versicherten genutzt wurde --> Wie lang haben Versicherter 11111 und 12345 insgesamt Leistung a bezogen in 2016?
2. Wie viele Monate Leistung a/b/c/d .... insgesamt einzeln von jedem individuellen Versicherten genutzt wurde --> Wie lang hat Versicherter 12345 insgesamt Leistung a bezogen in 2016?
3. Wie viele Monate Leistung a ZEITGLEICH mit Leistung b/c/d... insgesamt von allen Versicherten genutzt wurde --> Wie lang haben Versicherter 11111 und 12345 insgesamt in 2016 zum gleichen Zeitpunkt jeweils Leistung a und Leistung b bezogen?
4. Wie viele Monate Leistung a ZEITGLEICH mit Leistung b/c/d... insgesamt von jedem individuellen Versicherten genutzt wurde --> Wie lang hat Versicherter 12345 insgesamt in 2016 zum gleichen Zeitpunkt Leistung a und Leistung b bezogen?
Frage 3 lässt sich nach Lösung von Frage 4 beantworten, wenn man die Ergebnisse für die individuellen Versicherten hat, kann man diese aufsummieren.
Insofern bleibt Frage 4, die ich nochmals genauer spezifizieren würde.
Vermutlich wird die Summe der Zeiträume gesucht, zu denen jeweils Leistung a und eine beliebige andere Leistung überlappend in Anspruch genommen wurde. (nach meinem Verständnis "gleichzeitig").
Alternativ könnte man auch ermitteln, welche Leistungen mit gleicher Zeitdauer genutzt wurden (nach meinem Verständnis "zeitgleich"). Wenn also in 2015 Leistung a 3 Monate lang genutzt wurde und Leistung b in 2016 3 Monate lang genutzt wurde wäre dies zeitgleich.
Die dritte Option wäre unterschiedliche Leistungen zu suchen, die exakt zum gleichen Zeitraum genutzt wurden. Also Leistung a exakt vom 01.01.2018 bis 01.05.2018 und Leistung b ebenfalls exakt von 01.01.2018 bis 01.05.2018.
Vermutlich wird für die erste Variante eine Lösung auf Tagesbasis gesucht. Also wieviele Tage wurde Leistung a mit einer beliebigen anderen Leistung genutzt. Wenn man noch mehr Details haben will, könnte man auch exakt aufsplitten, wie die Überschneidungen pro Leistung sind.
Meine Idee wäre hier die Leistungen in separate Tabelle aufzuspalten und anschliessend über die Bezugszeiträume als Gültigkeiten zu joinen. Über eine entsprechende Berechnung kann ich die Anzahl Tage ermitteln und anschliessend aufsummieren.
Das Ganze in einem Macro für die möglichen Kombinationen mit abschliessender Zusammenführung der Ergebnisse.
Dies würde ich gegenüber der Lösung mit Arrays bevorzugen - aufgrund der Übersichtlichkeit und der Möglichkeit zum Debugging. Aber das ist sicherlich eine individuelle Entscheidung.
Nachfolgend mal ein schnelles Beispiel: (mit der Annahme, dass die Ausgangstabelle schon auf ein bestimmtes Jahr eingeschränkt ist. Ansonsten müsste man die Verarbeitung noch erweitern und die Auszählung für unterschiedliche Jahre trennen. Z.B. mit einem weiteren Data-Step)
data datensatz;
input
versicherter 5.
leistung $2.
start date10.
ende date10.;
format start ende date10.;
tage = ende-start;
cards;
12345 a 15jan2016 17aug2016
12345 a 01oct2016 31dec2016
12345 b 01feb2016 14jun2016
11111 a 01jan2016 17nov2016
11111 b 16jul2016 31aug2016
;
run;
/* Ermittlung Anzahl Leistungen */
proc sql noprint;
select count(distinct leistung) into :anz_leistungen from datensatz;
select distinct leistung into :leistungen separated by ' ' from datensatz;
quit;
data ergebnistabelle;
length versicherter 8
kriterium $10.
tage_ueberschneidung 8;
stop;
run;
%macro berechnung;
%do i = 1 %to &anz_leistungen;
%put i = &i.;
%let leistung = %scan(&leistungen,&i);
%put leistung = &leistung.;
data basis
vergleich;
set datensatz;
if leistung = "&leistung." then output basis;
else output vergleich;
run;
/* Annahme: alle Datensätze in basis und vergleich sind pro Versichertem und Leistung hinsichtlich Zeitraum überschneidungsfrei */
proc sql;
create table zwischenschritt as
select a.versicherter,
"&leistung. mit x" as kriterium length = 10,
sum(-max(a.start, b.start), min(a.ende, b.ende)) as tage_ueberschneidung
from basis a, vergleich b
where ((b.start between a.start and a.ende)
or (b.ende between a.start and a.ende)
or (b.start le a.start and b.ende ge a.ende)
)
and a.versicherter = b.versicherter
;
quit;
proc append base=ergebnistabelle data=zwischenschritt;
run;
%end; /* anz_leistungen */
%mend berechnung;
%berechnung;
proc means data=ergebnistabelle nway noprint;
var tage_ueberschneidung;
class versicherter kriterium;
output out=ergebnis_versicherte (drop=_type_ _freq_) sum=tage_ueberschneidung;
run;
proc means data=ergebnistabelle nway noprint;
var tage_ueberschneidung;
class kriterium;
output out=ergebnis_kriterium (drop=_type_ _freq_) sum=tage_ueberschneidung;
run;
Schöne Grüsse
Michael
p.s.: sorry, ich habe auf einen bestimmten Beitrag geantwortet, daher ist mein Beitrag wohl im Verlauf dazwischen gerutscht. Ich bitte die Unordnung zu entschuldigen.
... View more