Matthias Blankenagel
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
Tobias Berg
Ich habe diesen nachvollziehbaren Wunsch auf unserer interne Ticket-Liste aufgenommen.
Tobias Berg
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
QUARTAL;Berichtsdatum im Quartal;TB.berichtsdatum;and
DATE;-1; Berichtsdatum ab;TB.berichtsdatum >=; and
DATE; 1; Berichtsdatum bis;TB.berichtsdatum <; and
STRING; Test (Kürzel, z.B. CRP); T.testident; and
STRING; Test (Bezeichnung, z.B. C-reaktives Protein); T.testbezeichnung; and
SELECTION;0; Grenzwertindikator; alle; ; nur auffällige (+ ++ - ‑‑ !); T.grenzwertindikator in ('+','++','-','--','!') AND; nur stark auffällige (++ ‑‑ !); T.grenzwertindikator in ('++','--', '!') AND
STRING; Anforderungsident;TB.anforderungsident; and
SELECTION;2; Befundtypen; alle Befundtypen; ; nur Endbefunde; TB.befundart ilike 'E%' AND
NUMBER;Patientennummer;P.ident;and
STRING;Vorname;P.vorname;and
STRING;Nachname;P.nachname;and
DATE;-1;Geburtsdatum ab;P.geburtsdatum >=; and
DATE; 1;Geburtsdatum bis;P.geburtsdatum <; and
QUARTAL;Eingangsdatum Labor im Quartal; TB.eingangsdatumLabor;and
DATE;-1; Eingangsdatum Labor ab; TB.eingangsdatumLabor >=; and
DATE; 1; Eingangsdatum Labor bis; TB.eingangsdatumLabor <; and
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;
Tobias Berg
--> 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
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
true
order by TT.patientid, TT.kuerzel, TT.berichtsdatum desc;