246 Aufrufe
Hallo,

gibt es eine Möglichkeit einzelne Laborwerte ein einem bestimmten Zeitbereich (z. B. Monat oder Quartal) über eine Statistik abzufragen? Ideal wäre, wenn man anschließend noch über die Nachfilterung eigene Grenzwerte bzw. Ergebnisbereiche eingrenzen könnte.

In diesem Zusammenhang möchte ich noch eine Frage anschließen. Kann man alle pathologischen Laborwerte eines bestimmten Zeitbereiches (z. B. Tag) über eine Statistik abfragen?

MfG

Matthias Blankenagel
Gefragt von (350 Punkte) | 246 Aufrufe
0 Punkte

3 Antworten

Ich habe diesen nachvollziehbaren Wunsch auf unserer interne Ticket-Liste aufgenommen.
Beantwortet von (23.3k Punkte)
0 Punkte
Die Laborwert-Statistik kommt in Version 1.35 (keine Aussage über Veröffentlichungsdatum möglich). Wer die Abfrage schon vorher benutzen möchte, kann unter admin->Statistikverwaltung eine 'Eigene Abfrage' mit folgendem SQL-Code anlegen.  (1 zwei teile aufgeteilt, da ansonsten zu lang)

 

drop table if exists tempLaborAbfrageTable;
        create temporary table tempLaborAbfrageTable as
        select
             TB.eingangsdatumLabor,
                   TB.berichtsdatum,
                   TB.berichtsdatum as datum_neuester_Wert, -- will be overwritten below
            TB.befundart,
            TB.abrechnungstyp,
            TB.anforderungsident,
            TB.jokerfeld,
            TB.diagnosetexte,
            TB.auftragsbezogeneHinweise,
            TB.bereitsgesehen,
            T.testident as kuerzel,
            T.testbezeichnung,
            T.teststatus,
            T.probenmaterialindex,
            T.probenmaterialBezeichnung,
            T.ergebniswert,  
            T.ergebniswert as neuester_wert, -- will be overwritten below  
            T.einheit,
            T.normalwertuntergrenze,
            T.normalwertobergrenze,
            T.grenzwertindikator,
            T.normwerttexte,
            T.testbezogeneHinweise,
            T.ergebnistexte,
            T.ergebnistexte as neuester_Ergebnistext, -- will be overwritten below
            T.anforderungen,
            T.abnahmedatum,
            N2.kuerzel as erstaufnahme,
            N1.kuerzel as anforderer,
            P.ident as patientID,
            P.nachname,
            P.vorname,
            P.titel,
            P.geburtsdatum,
            LA.auftrag,
            LA.ident as LaborauftragIdent,
            LA.removed as LAremoved,
            TB.removed as TBremoved
        from lb820x TB
        join LB820X_lbtest JTT
        on (JTT.lb820X_ident = TB.ident)
        join lbtestlbanforderung T
        on (T.ident = JTT.lbtest_ident)
        left join Nutzer N1
        on (TB.erstaufnahme_ident = N1.ident)
        left join Nutzer N2
        on (TB.anforderer_ident = N2.ident)
        left join patient P
        on (P.ident = TB.patient_ident)
        left join laborbefund_lb820X JTLB
        on (JTLB.lb820X_ident = TB.ident)
        left join laborbefund LB
        on (lb.ident = JTLB.laborbefund_ident)
        left join Laborauftrag LA
        on (LA.laborbefund_ident = LB.ident)
        where
        <ZS:queryParameterDatumBericht1> QUARTAL;Berichtsdatum im Quartal;TB.berichtsdatum;and </ZS>
        <ZS:queryParameterDatumBericht2> DATE;-1; Berichtsdatum ab;TB.berichtsdatum >=; and </ZS>
        <ZS:queryParameterDatumBericht3> DATE; 1; Berichtsdatum bis;TB.berichtsdatum <; and </ZS>
        <ZS:queryParameterTestident> STRING;     Test (Kürzel, z.B. CRP); T.testident; and</ZS>
        <ZS:queryParametertestbezeichnung> STRING; Test (Bezeichnung, z.B. C-reaktives Protein); T.testbezeichnung; and</ZS>
        <ZS:queryParameterSelectionGrenzwertindikator> SELECTION;0; Grenzwertindikator; alle; ; nur auffällige (+ ++ - ‑‑ !); T.grenzwertindikator in ('+','++','-','--','!') AND; nur stark auffällige (++ ‑‑ !); T.grenzwertindikator in ('++','--', '!') AND</ZS>
        <ZS:queryParameterAnfordrungsident> STRING;     Anforderungsident;TB.anforderungsident; and</ZS>
        <ZS:queryParameterSelectionBefundart> SELECTION;2; Befundtypen; alle Befundtypen; ; nur Endbefunde; TB.befundart ilike 'E%' AND</ZS>
        <ZS:queryParameterPat1> NUMBER;Patientennummer;P.ident;and </ZS>
        <ZS:queryParameterPat2> STRING;Vorname;P.vorname;and </ZS>
        <ZS:queryParameterPat3> STRING;Nachname;P.nachname;and </ZS>
        <ZS:queryParameterGeb1> DATE;-1;Geburtsdatum ab;P.geburtsdatum >=; and </ZS>
        <ZS:queryParameterGeb2> DATE; 1;Geburtsdatum bis;P.geburtsdatum <; and </ZS>
        <ZS:queryParameterDatumLabor4> QUARTAL;Eingangsdatum Labor im Quartal; TB.eingangsdatumLabor;and </ZS>
        <ZS:queryParameterDatumLabor5> DATE;-1; Eingangsdatum Labor ab; TB.eingangsdatumLabor >=; and </ZS>
        <ZS:queryParameterDatumLabor6> DATE; 1; Eingangsdatum Labor bis; TB.eingangsdatumLabor <; and </ZS>
        true;
        
        DROP index if exists "tempLabIdx1";
        CREATE INDEX "tempLabIdx1" ON tempLaborAbfrageTable (patientID ASC NULLS LAST);
        DROP index if exists "tempLabIdx2";
        CREATE INDEX "tempLabIdx2" ON tempLaborAbfrageTable (kuerzel ASC NULLS LAST);

        -- Anforderung #2823: ‚inkl aller aktuellen Werte‚
        -- Tabelle mit allen benötigten aktuellen Werten für den jeweiligen Patienten
        
        drop table if exists tempNeededWerteLaborAbfrageTable;
        create temporary table tempNeededWerteLaborAbfrageTable as
        select TT.patientID, TT.kuerzel from  tempLaborAbfrageTable TT group by  TT.patientID, TT.kuerzel;
Beantwortet von (23.3k Punkte)
0 Punkte
--> 2. Teil

 

   drop table if exists tempAlleLaborWerteTable;
        create temporary table tempAlleLaborWerteTable as
        select TB.patient_ident as patientID,
              T.testident as kuerzel,
              T.ergebniswert,
              T.ergebnistexte,
              TB.berichtsdatum
        from tempNeededWerteLaborAbfrageTable TTT
        join lb820x TB
        on (TB.patient_ident = TTT. patientID)
        join LB820X_lbtest JTT
        on (JTT.lb820X_ident = TB.ident)
        join lbtestlbanforderung T
        on (T.ident = JTT.lbtest_ident and TTT.kuerzel = T.testident)
        order by TB.patient_ident, T.testident, TB.berichtsdatum desc, TB.eingangsdatumlabor desc, T.ident desc;
        
        -- die Spalte ‚neuesterWert‘ füllen
        do $$
          declare
            row record;
            _lastPat bigint;
            _lastTestIdent text;
            _currentPat bigint;
            _currentTestIdent text;
            _currentWert real;
            _currentErgebnisText text;
            _currentTimeStamp timestamp;
          begin
           _lastPat := -1;
           _lastTestIdent := 'ZS_XXX';
            for row in
            select ctid, * from tempAlleLaborWerteTable
            for update loop
              _currentPat :=   row.patientID;
              _currentTestIdent := row.kuerzel;
               if (_currentPat <> _lastPat or _currentTestIdent <> _lastTestIdent) then
                -- RAISE NOTICE 'Neuer Block';
                _lastPat = _currentPat;
                _lastTestIdent := _currentTestIdent;
                _currentWert := row.ergebniswert;
                _currentErgebnisText := row.ergebnistexte;
                _currentTimeStamp := row.berichtsdatum;
                update tempLaborAbfrageTable TT set datum_neuester_Wert = _currentTimeStamp,  
                                               neuester_wert  = _currentWert  ,
                                              neuester_Ergebnistext  = _currentErgebnisText  
                where (TT. patientID = _lastPat and TT.kuerzel = _lastTestIdent);
               end if;
                     -- RAISE NOTICE 'Processing current_pat: % current_text: %', _currentPat, _currentTestIdent;
            end loop;
          end;
        $$;
        
        select  
                   TT.berichtsdatum,
            TT.patientID,
            TT.nachname,
            TT.vorname,
            TT.kuerzel,
            TT.testbezeichnung as bezeichnung,
            TT.ergebniswert,  
            TT.einheit,
            TT.ergebnistexte,
            TT.normalwertuntergrenze as norm_untergrenze,
            TT.normalwertobergrenze as norm_obergrenze,
            TT.grenzwertindikator,
            TT.normwerttexte,
            TT.datum_neuester_Wert,
            TT.neuester_Wert,
            TT.neuester_Ergebnistext,
            TT.anforderungsident as anforderungsident,
            CASE WHEN TT.befundart ilike 'E%' THEN 'Endbefund'
                 WHEN TT.befundart ilike 'V%' THEN 'Vorbefund'
                 WHEN TT.befundart ilike 'T%' THEN 'Teilbefund'
                 WHEN TT.befundart ilike 'N%' THEN 'Nachtrag'
                 WHEN TT.befundart ilike 'A%' THEN 'Archiv'               ELSE TT.befundart END as befundart,
            TT.jokerfeld as freitext,
            TT.diagnosetexte,
            TT.auftragsbezogeneHinweise,
            TT.bereitsgesehen as gelesen,
            CASE WHEN TT.teststatus ilike 'B%' THEN 'bereits berichtet'
                 WHEN TT.teststatus ilike 'K%' THEN 'korrigierter Wert'
                 WHEN TT.teststatus ilike 'F%' THEN 'folgt/fehlt'    
            ELSE TT.teststatus END as status,
            TT.probenmaterialindex as material_kuerzel,
            TT.probenmaterialBezeichnung as material,
            CASE WHEN TT.abrechnungstyp ilike 'K%' THEN 'Kasse'
                 WHEN TT.abrechnungstyp ilike 'P%' THEN 'Vorbefund'
                 WHEN TT.abrechnungstyp ilike 'X%' THEN 'Andere'
                 WHEN TT.abrechnungstyp ilike 'N%' THEN 'Einsender persönlich'     
            ELSE TT.abrechnungstyp END as abrechnungstyp,
            TT.testbezogeneHinweise,
            TT.anforderungen,
             TT.eingangsdatumLabor,
            TT.abnahmedatum,
            TT.titel,
            TT.geburtsdatum,
            KE.datum as datumKartei,
            KE.text as textKartei,
            KE.ident as karteieintragID,
            TT.erstaufnahme,
            TT.anforderer,
            TT.auftrag
        from tempLaborAbfrageTable TT
        left join Karteieintrag KE
        on (KE.laborauftrag_ident = TT. LaborauftragIdent)
        where
        <ZS:queryParameterSelectionGeloeschte> SELECTION;2; Umgang mit gelöschten Einträgen (bitte nur im Zusammenhang mit zeitlicher Einschränkung benutzen!); nur sichtbare anzeigen; TT.TBremoved = false AND TT.LAremoved = false AND KE.visible = true AND; nur gelöschte anzeigen; (TT.TBremoved = true OR TT.LAremoved = true OR KE.visible = false) AND</ZS>
        true
        order by TT.patientid, TT.kuerzel, TT.berichtsdatum desc;
Beantwortet von (23.3k Punkte)
0 Punkte
3,195 Beiträge
5,943 Antworten
6,911 Kommentare
1,364 Nutzer