From b9ff3caa9c588c7c491b227b70e70a2f94dadba5 Mon Sep 17 00:00:00 2001 From: Daniel Quathamer Date: Wed, 20 Dec 2023 10:56:55 +0100 Subject: [PATCH] =?UTF-8?q?Beschleunigung=20Laderoutine,=20Status=20zum=20?= =?UTF-8?q?Semesterende=20Examtr.=20z=C3=A4hlt=20als=20immatr.=20#16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../costage_st_studien_aggr_fuellen.sql | 195 +++++++++++++----- 1 file changed, 139 insertions(+), 56 deletions(-) diff --git a/src-modules/module/costage/hilfstabellen/costage_st_studien_aggr_fuellen.sql b/src-modules/module/costage/hilfstabellen/costage_st_studien_aggr_fuellen.sql index e736822..687019a 100644 --- a/src-modules/module/costage/hilfstabellen/costage_st_studien_aggr_fuellen.sql +++ b/src-modules/module/costage/hilfstabellen/costage_st_studien_aggr_fuellen.sql @@ -58,7 +58,9 @@ null::integer as hzb_land_sub_r_nr , null::integer as hzb_jahr, null::date as hzb_datum , null::decimal(14,7) as hzb_note, -rank () over (partition by SM.st_sem_nr, S.st_studstamm_nr, SG.studiengangs_identifikator order by (case when SA.gueltig_ab =SM.semester_ende then date_val('01.01.1900') else SA.gueltig_ab end) desc) as status_historie +null::char(10) as abm_art_s, +rank () over (partition by SM.st_sem_nr, S.st_studstamm_nr, SG.studiengangs_identifikator order by SA.gueltig_ab desc) as status_historie +--rank () over (partition by SM.st_sem_nr, S.st_studstamm_nr, SG.studiengangs_identifikator order by (case when SA.gueltig_ab =SM.semester_ende then date_val('01.01.1900') else SA.gueltig_ab end) desc) as status_historie into temp tmp_studien FROM costage_st_studierendenstammdaten S, costage_st_studien ST, @@ -77,19 +79,25 @@ and SG.studiengangs_typ_kb in ('ESG','TSG','MSG') and SA.st_studium_nr=ST.st_studium_nr and SA.st_sem_nr=SM.st_sem_nr and SA.gueltig_ab <=SM.semester_ende --nur letzter Status im jew. Semester interessiert, nicht danach -and (SA.studienstatustyp not in ('Z','X') or (SA.studienstatustyp in ('Z','X') and SA.gueltig_ab <= today())) --Studis außer erst/neueinschr/rückmeld/beurlaubt werden in der Semestermitte exmatr. zum Endedatum Semesterende, wenn dieses Datum in der Zukunft liegt soll der Studi mit dem vorherigen Status erscheinen +and (SA.studienstatustyp not in ('Z','X') or ( + SA.studienstatustyp in ('Z','X') + and SA.gueltig_ab <= today() + and date(SA.gueltig_ab) < date(SM.semester_ende) + )) --Studis außer erst/neueinschr/rückmeld/beurlaubt werden in der Semestermitte exmatr. zum Endedatum Semesterende, wenn dieses Datum in der Zukunft liegt soll der Studi mit dem vorherigen Status erscheinen --and SA.studienstatustyp not in ('a','o') and ${COSTAGE_STUDENT_FILTER} and SM.semester_tid >= ${beginn_semester} --group by 1,2,3,4,5,6,7,8,9,10,11,12,13 ; +select 1,timestamp_str(now()) from xdummy; update tmp_studien set hrst=H.hoererstatus_kb from costage_st_hoererstatus H where tmp_studien.st_studstamm_nr = H.st_studstamm_nr and tmp_studien.st_sem_nr = H.st_sem_nr +and hoererstatus_kb != 'E' --der Hörerstatus "E - Exmatrikuliert" gilt eigentlich erst zum Studienende, hat aber kein "gültig ab" Datum. Der Hörerstatus "E" kann ignoriert werden. ; @@ -117,6 +125,21 @@ from costage_st_hzb H where tmp_studien.st_studstamm_nr = H.st_person_nr ; +select 10,timestamp_str(now()) from xdummy; + +--Abmeldungsart studienbezogen: +update tmp_studien set abm_art_s=P.st_abm_art_kurzbezeichnung +from costage_st_personen_abmeldungen P, costage_st_semester S, costage_st_abmeldungsarten A +where S.st_sem_nr=P.st_sem_nr +and S.semester_tid=tmp_studien.semester +and P.st_studium_nr=tmp_studien.st_studium_nr +and A.st_abm_art_kurzbezeichnung=P.st_abm_art_kurzbezeichnung +and A.bezug='S' +; + + +select 20,timestamp_str(now()) from xdummy; + create index tmp_ix1 on tmp_studien(st_studiengang_nr); create index tmp_ix2 on tmp_studien(st_studstamm_nr); @@ -140,64 +163,95 @@ from tmp_studien T --2. Prio: aus costage_st_hauptstudien: insert into tmp_studien2 select T.*, -1::integer as primaerflag, -null::integer as letztes_tsg_semester -from tmp_studien T, costage_st_hauptstudien H - where H.st_studstamm_nr=T.st_studstamm_nr - and H.st_studium_nr=T.st_studium_nr - and H.st_sem_nr=T.st_sem_nr - and status_historie=1 - and T.studiengangs_typ_kb in ('ESG','TSG') - and T.primaerflag_studien=0 - ; ---Studiengänge ohne Primärflag TODO langsam: - insert into tmp_studien2 - select T.*, -0::integer as primaerflag, +(case when H.st_studstamm_nr > 0 then 1::integer else 0::integer end) as primaerflag, null::integer as letztes_tsg_semester - from tmp_studien T left outer join costage_st_hauptstudien H - on (H.st_studstamm_nr=T.st_studstamm_nr +from tmp_studien T left outer join costage_st_hauptstudien H + on ( H.st_studstamm_nr=T.st_studstamm_nr and H.st_studium_nr=T.st_studium_nr and H.st_sem_nr=T.st_sem_nr) where T.status_historie=1 and T.studiengangs_typ_kb in ('ESG','TSG') and T.primaerflag_studien=0 - and H.st_studstamm_nr is null - ; + ; + +select 30,timestamp_str(now()) from xdummy; +--Studiengänge ohne Primärflag TODO langsam: + -- insert into tmp_studien2 + -- select T.*, +-- 0::integer as primaerflag, +-- null::integer as letztes_tsg_semester + -- from tmp_studien T left outer join costage_st_hauptstudien H + -- on (H.st_studstamm_nr=T.st_studstamm_nr + -- and H.st_studium_nr=T.st_studium_nr + -- and H.st_sem_nr=T.st_sem_nr) + -- where T.status_historie=1 + -- and T.studiengangs_typ_kb in ('ESG','TSG') + -- and T.primaerflag_studien=0 + -- and H.st_studstamm_nr is null + -- ; + +select 40,timestamp_str(now()) from xdummy; --Ermittlung msg bei TSG: --es kann pro Studi und Semester und Abschlussziel mehrere MSG geben, ---daqher zuerst den jeweils letzten ermiteln. Dieser ist dann der Default-MSG: -select st_sem_nr,st_absz_nr,st_studstamm_nr,max(beginn_datum) as beginn_datum +--daqher zuerst den jeweils letzten ermitteln. Dieser ist dann der Default-MSG: +select st_sem_nr, +st_absz_nr, +st_studstamm_nr, +null::integer as st_studiengang_nr_msg, +max(beginn_datum) as beginn_datum into temp tmp_last_msg_per_term from tmp_studien where studiengangs_typ_kb='MSG' group by 1,2,3 ; +update tmp_last_msg_per_term set st_studiengang_nr_msg=T.st_studiengang_nr_msg +from tmp_studien T +where T.studiengangs_typ_kb='MSG' +and T.st_absz_nr=tmp_last_msg_per_term.st_absz_nr +and T.st_studiengang_nr_msg is not null +and T.st_sem_nr=tmp_last_msg_per_term.st_sem_nr +and T.st_studstamm_nr=tmp_last_msg_per_term.st_studstamm_nr +and T.beginn_datum=tmp_last_msg_per_term.beginn_datum +; + --nur Diagnose Einzelschritt: --select st_studiengang_nr_msg,* from tmp_studien2 where semester=20222 --; --zuerst den jeweils letzten (=jüngsten) MSG zuweisen: --TODO: langsam: -update tmp_studien2 set st_studiengang_nr_msg=T.st_studiengang_nr_msg -from tmp_studien T,tmp_last_msg_per_term E, costage_st_studiengaenge_mtsg M -where M.st_studiengang_nr_tsg=tmp_studien2.st_studiengang_nr -and M.st_studiengang_nr_msg=T.st_studiengang_nr_msg -and T.st_sem_nr=tmp_studien2.st_sem_nr -and T.st_studstamm_nr=tmp_studien2.st_studstamm_nr -and E.st_sem_nr=tmp_studien2.st_sem_nr +update tmp_studien2 set st_studiengang_nr_msg=E.st_studiengang_nr_msg +from tmp_last_msg_per_term E +where E.st_sem_nr=tmp_studien2.st_sem_nr and E.st_studstamm_nr=tmp_studien2.st_studstamm_nr and E.st_absz_nr=tmp_studien2.st_absz_nr -and E.beginn_datum=T.beginn_datum -and T.studiengangs_typ_kb='MSG' -and T.st_absz_nr=tmp_studien2.st_absz_nr -and T.st_studiengang_nr_msg is not null and tmp_studien2.studiengangs_typ_kb ='TSG' ; + +-- +-- update tmp_studien2 set st_studiengang_nr_msg=T.st_studiengang_nr_msg +-- from tmp_studien T,tmp_last_msg_per_term E, costage_st_studiengaenge_mtsg M +-- where M.st_studiengang_nr_tsg=tmp_studien2.st_studiengang_nr +-- and M.st_studiengang_nr_msg=T.st_studiengang_nr_msg +-- and T.st_sem_nr=tmp_studien2.st_sem_nr +-- and T.st_studstamm_nr=tmp_studien2.st_studstamm_nr +-- and E.st_sem_nr=tmp_studien2.st_sem_nr +-- and E.st_studstamm_nr=tmp_studien2.st_studstamm_nr +-- and E.st_absz_nr=tmp_studien2.st_absz_nr +-- and E.beginn_datum=T.beginn_datum +-- and T.studiengangs_typ_kb='MSG' +-- and T.st_absz_nr=tmp_studien2.st_absz_nr +-- and T.st_studiengang_nr_msg is not null +-- and tmp_studien2.studiengangs_typ_kb ='TSG' +-- ; + +select 50,timestamp_str(now()) from xdummy; + + --wenn der jüngste MSG nicht paßt, wird der nächste passende --zugewiesen: update tmp_studien2 set st_studiengang_nr_msg=T.st_studiengang_nr_msg @@ -214,6 +268,7 @@ and tmp_studien2.st_studiengang_nr_msg is null ; +select 60,timestamp_str(now()) from xdummy; --statustyp bei TSG aus MSG nachladen: update tmp_studien2 set studienstatustyp=S.studienstatustyp @@ -227,6 +282,8 @@ and S.status_historie=1 ; +select 70,timestamp_str(now()) from xdummy; + drop table tmp_last_msg_per_term; @@ -242,6 +299,8 @@ and M.st_studiengang_nr_tsg=T.st_studiengang_nr and T.studiengangs_typ_kb ='TSG' ; +select 80,timestamp_str(now()) from xdummy; + --Start- und Endsemester aller MSG pro Student: drop table if exists tmp_studien_msg; @@ -256,6 +315,10 @@ and T.studiengangs_typ_kb ='MSG'--enthält die MSG and T.status_historie=1 group by 1,2 ; + +select 90,timestamp_str(now()) from xdummy; + + --Verknüpfung mit TSG über alle möglichen Semester: drop table if exists tmp_studien_msg_tsg; select distinct @@ -276,6 +339,9 @@ and M.st_studstamm_nr=T.st_studstamm_nr and E.semester_tid between M.startsemester and M.endsemester and T.studiengangs_typ_kb ='TSG' ; + +select 100,timestamp_str(now()) from xdummy; + --nun fehlende Datensätze ermitteln: drop table if exists tmp_studien_msg_tsg_fehlend; select T.* @@ -325,6 +391,7 @@ hzb_land_sub_r_nr , hzb_jahr, hzb_datum , hzb_note, +abm_art_s, fachsemester, letztes_tsg_semester) select M.semester, @@ -361,6 +428,7 @@ S.hzb_land_sub_r_nr , S.hzb_jahr, S.hzb_datum , S.hzb_note, +null::char(10) as abm_art_s, null::integer as fachsemester, max(S.semester) from tmp_studien_msg_tsg_fehlend M, tmp_studien3 S --,costage_st_semester E @@ -373,9 +441,11 @@ and M.semester != S.semester --and S.st_studiengang_nr_msg=34454 --and S.studiengangs_bezeichnung='Bildungswissenschaften' --and M.semester=20211 -group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,23,24,25,26,27,28,29,30,31 +group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,23,24,25,26,27,28,29,30,31,32 ; +select 110,timestamp_str(now()) from xdummy; + --statustyp und hrst nachladen: update tmp_studien2 set studienstatustyp=S.studienstatustyp, hrst=S.hrst @@ -386,24 +456,28 @@ and S.studiengangs_typ_kb ='MSG' and tmp_studien2.tsg_generated=1 and tmp_studien2.st_sem_nr=S.st_sem_nr --Defaultmäßig den letzten Status im Semester nehmen (status_historie=1) +and S.status_historie=1 --Ausnahme: wenn der MSG bis zum Semesterende läuft und Status X hat, --wird er auf den vorherigen Status gesetzt, weil der Studi --bis Semesterende studiert hat -and ( -(S.status_historie=1 and -( -S.gueltig_ab < S.semester_ende or (S.gueltig_ab >= S.semester_ende and S.studienstatustyp !='X') -) -) -or -(S.status_historie=2 and S.gueltig_ab < S.semester_ende) - ) +-- and ( +-- (S.status_historie=1 and +-- ( +-- S.gueltig_ab < S.semester_ende or (S.gueltig_ab >= S.semester_ende and S.studienstatustyp !='X') +-- ) +-- ) +-- or +-- (S.status_historie=2 and S.gueltig_ab < S.semester_ende) + -- ) ; +select 120,timestamp_str(now()) from xdummy; + --statustyp_tsg nachladen: -update tmp_studien2 set statustyp_tsg=S.statustyp_tsg, -fachsemester=S.fachsemester +update tmp_studien2 set statustyp_tsg='X' , -- generierte TSG sind immer geschlossen S.statustyp_tsg, +fachsemester=S.fachsemester, +abm_art_s=S.abm_art_s from tmp_studien S where tmp_studien2.st_studium_nr=S.st_studium_nr and tmp_studien2.st_studstamm_nr=S.st_studstamm_nr @@ -413,6 +487,8 @@ and tmp_studien2.letztes_tsg_semester=S.semester and S.status_historie=1 ; +select 130,timestamp_str(now()) from xdummy; + drop table tmp_studien_msg_tsg_fehlend; drop table tmp_studien_msg_tsg; drop table tmp_studien_msg; @@ -435,6 +511,7 @@ and tmp_studien2.studiengangs_typ_kb ='TSG' update tmp_studien2 set fach_nr=1 where fach_nr is null; +select 140,timestamp_str(now()) from xdummy; update tmp_studien2 set unikey=K.unikey @@ -483,6 +560,8 @@ and T.semester=tmp_studien2.semester and T.st_studiengang_nr_msg=tmp_studien2.st_studiengang_nr_msg ) ; +select 150,timestamp_str(now()) from xdummy; + --SPO-Version (letzte im jew. Semester) ermitteln: select T.*,null::char(10) as po_stp_stp_version_kb, @@ -492,9 +571,11 @@ into temp tmp_studien3 from tmp_studien2 T left outer join costage_st_studien_spoversionen SPO on (SPO.st_studium_nr=T.st_studium_nr and SPO.gueltig_ab < T.semester_ende) -group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 ; +select 160,timestamp_str(now()) from xdummy; + update tmp_studien3 set po_stp_stp_version_kb= SPO.po_stp_stp_version_kb, po_regelstudienzeit=SPO.po_regelstudienzeit from costage_st_studien_spoversionen SPO @@ -506,6 +587,7 @@ from cifx where key=400 and apnr=tmp_studien3.statustyp_tsg ); +select 170,timestamp_str(now()) from xdummy; drop table tmp_studien2; @@ -548,6 +630,7 @@ st_studium_nr, hzb_jahr, hzb_datum, hzb_note, + abm_art_s, po_stp_stp_version_kb, po_regelstudienzeit, summe @@ -594,6 +677,7 @@ select st_studium_nr, hzb_jahr, hzb_datum, hzb_note, + abm_art_s, po_stp_stp_version_kb, po_regelstudienzeit, 1 as summe @@ -633,6 +717,7 @@ st_studium_nr, hzb_jahr, hzb_datum, hzb_note, + abm_art_s, po_stp_stp_version_kb, po_regelstudienzeit, summe @@ -680,12 +765,14 @@ cast (NULL as int) as studiengang_nr2, hzb_jahr, hzb_datum, hzb_note, + abm_art_s, po_stp_stp_version_kb, po_regelstudienzeit, 1 as summe from tmp_studien3 where kz_rueck_beur_ein is null ; +select 180,timestamp_str(now()) from xdummy; --Wenn pro Semester und Matrikelnr. keine studiengang_nr=1 existiert, werden diese um 1 reduziert: select st_studstamm_nr,semester,min(studiengang_nr) as studiengang_nr_min @@ -707,6 +794,7 @@ and S.studiengang_nr_min=1 drop table tmp_studien_ohne_studiengangnr_1; +select 190,timestamp_str(now()) from xdummy; --HZB Data: @@ -722,16 +810,8 @@ and A.st_abm_art_kurzbezeichnung=P.st_abm_art_kurzbezeichnung and A.bezug='P' and costage_st_studien_aggr.semester >= ${beginn_semester} ; ---dann studienbezogen: -update costage_st_studien_aggr set abm_art_s=P.st_abm_art_kurzbezeichnung -from costage_st_personen_abmeldungen P, costage_st_semester S, costage_st_abmeldungsarten A -where S.st_sem_nr=P.st_sem_nr -and S.semester_tid=costage_st_studien_aggr.semester -and P.st_studium_nr=costage_st_studien_aggr.st_studium_nr -and A.st_abm_art_kurzbezeichnung=P.st_abm_art_kurzbezeichnung -and A.bezug='S' -and costage_st_studien_aggr.semester >= ${beginn_semester} -; + +select 200,timestamp_str(now()) from xdummy; --Beurlaubungs-Art: @@ -773,6 +853,9 @@ and A.st_adresse_typ='H' and costage_st_studien_aggr.semester >= ${beginn_semester} ; +select 300,timestamp_str(now()) from xdummy; + + drop table tmp_studien3; drop table tmp_primaer_msg;