Verschachtelte Abfragen

Denfroe

Benutzer
Beiträge
15
Hallo zusammen,

ich habe eine Frage, die verschiedene Abfragen verknüpft. Im Vornherein möchte ich schon mal sagen, dass mein MySQL Wissen begrenzt ist. Im Rahmen meiner Masterarbeit habe ich probiert so gut es ging mir etwas über MySQl selbst beizubringen. Jedoch komme ich bei dem folgenden Problem nicht weiter.

Es geht dabei darum, dass ich über den Beobachtungszeitraum (2006,2008,2010,2012,2013) Fachabteilungen mit ihren ärztlichen Fachexpertisen vergleichen möchte. Dadurch möchte ich herausfinden, ob sich die ärztliche Fachexpertise über die Jahre verändert.

Hierfür habe ich eine Tabelle mit den folgenden Einträgen (siehe auch angehängtes Bild):
- uid: identifiziert ein Krankenhaus (iknr) für ein bestimmtes Jahr
- jahr: Beobachtungszeiträume [2006,2008,2010,2012,2013]
- kh_iknr: Instiutionskennzeichnung. Jedes Krankenhaus besitzt eine eindeutig zugeordnete Nummer (verändert sich nicht über die Jahre).
- fa_nr: Fachabteilungsnummer nicht geordnet
- fa_nr_neu: Fachabteilungsnummer geordnet. Sodas die Fachabteilungsnummer über die Jahre konsistent ist.
- aq_zf_schl: ärztliche Fachexpertise. Jede Abteilung hat eine Menge von Schlüsseln, die die Fachexpertise wiedergint.


Mit der Abfrage möchte ich folgendes erreichen (nur eine Idee):

1) starten mit dem Vergleich von zwei aufeinanderfolgenden Betrachtungszeiträumen 2006 und 2008
2) wähle das erste Krankenhaus aus der Liste
3) nehme die erste Fachabteilung
4) gucke dir die ärztliche Fachexpertise aus dem Jahr 2006 an
5) und vergleiche sie mit der ärztlichen Fachexpertise aus dem Jahr 2008
6) zähle die neu dazugekommenen Schlüssel (aq_zf_schl)
7) nehme die nächste Fachabteilung und führe die Schritt (4-6) nochmals durch [dies wiederhole so lange, bis keine Fachabteilungen mehr über sind]
8) Wenn es keine Fachabteilungen mehr gibt, nehme das nächste Krankenhaus und gehe die Schritte (3-7 durch)
9) Wenn alle Krankenhäuser für den Beobachtungszeitraum abgearbeitet sind, dann springe in den nächsten (2008 und 2010) und wiederhole die Schritte (2-8)


Bei der Tabelle ist noch folgendes zu beachten:

- Die Fachabteilungsnummern sind nicht immer durchgehende nummeriert, wie z.B. 1,2,3,4,5,6,7,8 es kann auch vorkommen, dass manche Fachabteilungsnummern nicht vergeben sind z.B. 1,2,3,7,8,12,13,17. Es kann auch passieren, dass nicht mit der Nummer 1 gestartet wird. Fachabteilungsnummern können nur in den Bereichen 1 bis 98 vorkommen. Die Zahl 99 bedeutet, dass keine Zuordnung stattgefunden hat. Dieses darf nicht mit berücksichtig werden. Der Code müsste somit immer die Zahlen 1 bis 98 durchlaufen und dann abbrechen und zum nächsten Krankenhaus wechseln.

- Bei den Jahren ist zu berücksichtigen, dass manche Fachabteilungen nicht in jedem Betrachtungszeitraum auftauchen. Es kann z.B. so etwas passieren:
o Fa_nr_neu 3 = 2006,2008 und 2012,2013 oder
o Fa_nr_neu 5 = 2010,2012,2013
- Hier weiß ich leider noch nicht, wie man das berücksichtigen könnte. Vielleicht teilt man die Ausgangstabelle in 5 Hilfstabellen, für jedes Jahr eine, und führt dann die Abfragen durch. So das z.B. erstmal der Fall der Veränderungen in den Fachexpertisen vom Jahr 2006 auf das Jahr 2008 untersucht wird und dann 2008 auf 2010 usw.


Ich habe mit dem Code schon mal für einen konkreten Fall angefangen.

SELECT uid, jahr, kh_iknr, fa_nr_neu, count(aq_zf_schl) as Inno_1 FROM quali.kh_fa_afe WHERE (
aq_zf_schl NOT IN(
SELECT aq_zf_schl FROM quali.kh_fa_afe WHERE jahr = 2006 AND kh_iknr = 260100023 AND fa_nr_neu =1
)
AND jahr = 2008 AND kh_iknr = 260100023 AND fa_nr_neu =1
)


Als Ergebnis sollte ein Code rauskommem, der die komplette Tabelle durchläuft, und für jede Fachabteilung eine neue Spalte hinzufügt, in der gezählt wird, ob neue ärztliche Fachexpertise dazugekommen ist und wie viel.

Ich hoffe ich konnte mein Problem einigermaßen vernünftig schildern. Falls ihr noch mehr Informationen benötigt, dann probiere ich mein Problem noch genauer oder anders zu beschreiben.

 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    15,7 KB · Aufrufe: 5
Werbung:
Dürfte mit MySQL recht schwer werden.

In PostgreSQL könntest Du mit mit Window-Funktionen arbeiten:

Code:
test=*# select * from denfroe ;
 uid  | jahr | aq_zf_schl
------+------+------------
  3 | 2006 | AQ28
  3 | 2006 | AQ29
  3 | 2006 | ZF28
  3 | 2006 | AQ24
 3004 | 2008 | AQ23
 3004 | 2008 | AQ28
 3004 | 2008 | AQ24
 3004 | 2008 | AQ29
(8 rows)

test=*# select jahr, a, lag(a) over (order by jahr) as vorjahr from (select jahr, array_agg(aq_zf_schl) as a from denfroe group by jahr) foo;
 jahr |  a  |  vorjahr
------+-----------------------+-----------------------
 2006 | {AQ28,AQ29,ZF28,AQ24} |
 2008 | {AQ23,AQ28,AQ24,AQ29} | {AQ28,AQ29,ZF28,AQ24}
(2 rows)

Ich hab von Deiner Tabelle nur relevante Spalten genommen, nicht die, die immer gleich sind. Nun müßte man noch die Arrays in den Spalten a und vorjahr (könnte man auch besser benennen) vergleichen, was da der Unterschied ist. Hier wäre besser, statt der Text-Werte INT zu nehmen, um von den Operatoren hier PostgreSQL: Documentation: 9.4: intarray profitieren zu können. Oder aber man baut sich solche Operatoren, siehe The plate is bad: FORTRAN 90 like vector operations in PostgreSQL.

Egal, Du hast MySQL. Damit wird das echt schwer. Ich wünsch Dir Erfolg!

PS.: Deine Tabelle scheint keinen Primary Key zu haben.
 
Ich hätte vielleicht noch eine Idee.

Was ist, wenn man die Haupttabelle in 5 Hilfstabellen aufteilt. Also für jedes Jahr eine.
Könnte man dann nicht eine Abfrage in der Form machen, dass man z.B. die Tabelle 2006 und 2008 vergleicht.

Und dort dann sowas wie ein case baut.
1) Nehme Fachabteilung 1
2) Wenn vorhanden, dann vergleiche Einträge von 2006 und 2008 und gucke, wie viele neue Einträge dazu gekommen sind
3) Dann springe zur nächsten Fachabteilung
4) Wenn die Fachabteilungsnummer nicht vergeben ist, dann springe zu der nächsten.
-> hier sollten dann 1-98 durchgegangen werden.

Und dann nur die Krankenhäuser durchlaufen lassen, also alle die in der Liste sind. Jedes Krankenhaus hat in jedem Jahr einen Eintrag.

Wäre so etwas möglich und wenn ja, wie könnte man sowas umsetzten?
 
Das kann gut sein, dass es nicht die schönste Form ist, aber für mich ist vor allem wichtig, dass was dabei raus kommt, womit ich weiter arbeiten kann.

Ich weiß leider nicht, wie ich sonst das Problem lösen kann.
 
Tja.

Ich hab eine Lösung angedeutet. Allerdings nutzt Du derzeit halt die falsche DB. Du kannst nun weiter rumwurschteln und den Pfusch zementieren oder Nägel mit Köpfen machen. Deine Entscheidung.
 
Probieren kann man es ja ;)

Kenne mich mit PostgreSQL halt gar nicht aus und ob ich es da umsetzten kann weiß ich auch nicht :(
Bzw. ob ich es überhaupt verstehe, da ich kein Informatiker bin und auch nicht das Backround-Wissen habe.
 
betrachte PostgreSQL mal als die Features / Fähigkeiten von MySQL plus vieles, vieles mehr. Das, was Du mit MySQL hinbekommst, wirst auch mit PostgreSQL schaffen. Dort, wo Du aber bei MySQL nicht weiter kommst, findest unter PostgreSQL vielleicht eine Lösung.
 
Werbung:
Um Dein Problem noch mal zu zeigen und wie es mit PG lösbar ist:

Du hast:

Code:
test=*# select * from bla;
 jahr | val
------+-----
 2015 |  1
 2015 |  2
 2015 |  4
 2015 |  5
 2016 |  1
 2016 |  3
 2016 |  4
 2016 |  5
(8 rows)

und willst wissen, was der Unterschied zwischen den Werten für die 2 Jahre ist, also was neu dazugekommen ist und was entfallen:

Code:
test=*# select *, a-alt as neu_dazu, alt-a as entfallen from (select jahr, a, lag(a) over (order by jahr) as alt from (select jahr, array_agg(val) as a from bla group by jahr) foo) x;
 jahr |  a  |  alt  | neu_dazu | entfallen
------+-----------+-----------+----------+-----------
 2015 | {1,2,4,5} |  |  |
 2016 | {1,3,4,5} | {1,2,4,5} | {3}  | {2}
(2 rows)

Mag jetzt erst mal ungewohnt aussehen, aber eigentlich ganz trivial.
 
Zurück
Oben