initial
This commit is contained in:
156
sql/firstday/blood_gas_first_day_arterial.sql
Normal file
156
sql/firstday/blood_gas_first_day_arterial.sql
Normal file
@@ -0,0 +1,156 @@
|
||||
-- THIS SCRIPT IS AUTOMATICALLY GENERATED. DO NOT EDIT IT DIRECTLY.
|
||||
DROP TABLE IF EXISTS blood_gas_first_day_arterial; CREATE TABLE blood_gas_first_day_arterial AS
|
||||
|
||||
with stg_spo2 as
|
||||
(
|
||||
select subject_id, hadm_id, icustay_id, charttime
|
||||
-- max here is just used to group SpO2 by charttime
|
||||
, max(case when valuenum <= 0 or valuenum > 100 then null else valuenum end) as SpO2
|
||||
FROM chartevents
|
||||
-- o2 sat
|
||||
where ITEMID in
|
||||
(
|
||||
646 -- SpO2
|
||||
, 220277 -- O2 saturation pulseoxymetry
|
||||
)
|
||||
group by subject_id, hadm_id, icustay_id, charttime
|
||||
)
|
||||
, stg_fio2 as
|
||||
(
|
||||
select subject_id, hadm_id, icustay_id, charttime
|
||||
-- pre-process the FiO2s to ensure they are between 21-100%
|
||||
, max(
|
||||
case
|
||||
when itemid = 223835
|
||||
then case
|
||||
when valuenum > 0 and valuenum <= 1
|
||||
then valuenum * 100
|
||||
-- improperly input data - looks like O2 flow in litres
|
||||
when valuenum > 1 and valuenum < 21
|
||||
then null
|
||||
when valuenum >= 21 and valuenum <= 100
|
||||
then valuenum
|
||||
else null end -- unphysiological
|
||||
when itemid in (3420, 3422)
|
||||
-- all these values are well formatted
|
||||
then valuenum
|
||||
when itemid = 190 and valuenum > 0.20 and valuenum < 1
|
||||
-- well formatted but not in %
|
||||
then valuenum * 100
|
||||
else null end
|
||||
) as fio2_chartevents
|
||||
FROM chartevents
|
||||
where ITEMID in
|
||||
(
|
||||
3420 -- FiO2
|
||||
, 190 -- FiO2 set
|
||||
, 223835 -- Inspired O2 Fraction (FiO2)
|
||||
, 3422 -- FiO2 [measured]
|
||||
)
|
||||
-- exclude rows marked as error
|
||||
AND (error IS NULL OR error = 0)
|
||||
group by subject_id, hadm_id, icustay_id, charttime
|
||||
)
|
||||
, stg2 as
|
||||
(
|
||||
select bg.*
|
||||
, ROW_NUMBER() OVER (partition by bg.icustay_id, bg.charttime order by s1.charttime DESC) as lastRowSpO2
|
||||
, s1.spo2
|
||||
from blood_gas_first_day bg
|
||||
left join stg_spo2 s1
|
||||
-- same patient
|
||||
on bg.icustay_id = s1.icustay_id
|
||||
-- spo2 occurred at most 2 hours before this blood gas
|
||||
and s1.charttime >= DATETIME_SUB(bg.charttime, INTERVAL '2' HOUR)
|
||||
and s1.charttime <= bg.charttime
|
||||
where bg.po2 is not null
|
||||
)
|
||||
, stg3 as
|
||||
(
|
||||
select bg.*
|
||||
, ROW_NUMBER() OVER (partition by bg.icustay_id, bg.charttime order by s2.charttime DESC) as lastRowFiO2
|
||||
, s2.fio2_chartevents
|
||||
|
||||
-- create our specimen prediction
|
||||
, 1/(1+exp(-(-0.02544
|
||||
+ 0.04598 * po2
|
||||
+ coalesce(-0.15356 * spo2 , -0.15356 * 97.49420 + 0.13429)
|
||||
+ coalesce( 0.00621 * fio2_chartevents , 0.00621 * 51.49550 + -0.24958)
|
||||
+ coalesce( 0.10559 * hemoglobin , 0.10559 * 10.32307 + 0.05954)
|
||||
+ coalesce( 0.13251 * so2 , 0.13251 * 93.66539 + -0.23172)
|
||||
+ coalesce(-0.01511 * pco2 , -0.01511 * 42.08866 + -0.01630)
|
||||
+ coalesce( 0.01480 * fio2 , 0.01480 * 63.97836 + -0.31142)
|
||||
+ coalesce(-0.00200 * aado2 , -0.00200 * 442.21186 + -0.01328)
|
||||
+ coalesce(-0.03220 * bicarbonate , -0.03220 * 22.96894 + -0.06535)
|
||||
+ coalesce( 0.05384 * totalco2 , 0.05384 * 24.72632 + -0.01405)
|
||||
+ coalesce( 0.08202 * lactate , 0.08202 * 3.06436 + 0.06038)
|
||||
+ coalesce( 0.10956 * ph , 0.10956 * 7.36233 + -0.00617)
|
||||
+ coalesce( 0.00848 * o2flow , 0.00848 * 7.59362 + -0.35803)
|
||||
))) as SPECIMEN_PROB
|
||||
from stg2 bg
|
||||
left join stg_fio2 s2
|
||||
-- same patient
|
||||
on bg.icustay_id = s2.icustay_id
|
||||
-- fio2 occurred at most 4 hours before this blood gas
|
||||
and s2.charttime between DATETIME_SUB(bg.charttime, INTERVAL '4' HOUR) and bg.charttime
|
||||
where bg.lastRowSpO2 = 1 -- only the row with the most recent SpO2 (if no SpO2 found lastRowSpO2 = 1)
|
||||
)
|
||||
|
||||
select subject_id, hadm_id,
|
||||
icustay_id, charttime
|
||||
, specimen -- raw data indicating sample type, only present 80% of the time
|
||||
|
||||
-- prediction of specimen for missing data
|
||||
, case
|
||||
when SPECIMEN is not null then SPECIMEN
|
||||
when SPECIMEN_PROB > 0.75 then 'ART'
|
||||
else null end as SPECIMEN_PRED
|
||||
, specimen_prob
|
||||
|
||||
-- oxygen related parameters
|
||||
, so2, spo2 -- note spo2 is FROM chartevents
|
||||
, po2, pco2
|
||||
, fio2_chartevents, fio2
|
||||
, aado2
|
||||
-- also calculate AADO2
|
||||
, case
|
||||
when PO2 is not null
|
||||
and pco2 is not null
|
||||
and coalesce(fio2, fio2_chartevents) is not null
|
||||
-- multiple by 100 because FiO2 is in a % but should be a fraction
|
||||
then (coalesce(fio2, fio2_chartevents)/100) * (760 - 47) - (pco2/0.8) - po2
|
||||
else null
|
||||
end as AADO2_calc
|
||||
, case
|
||||
when PO2 is not null and coalesce(fio2, fio2_chartevents) is not null
|
||||
-- multiply by 100 because FiO2 is in a % but should be a fraction
|
||||
then 100*PO2/(coalesce(fio2, fio2_chartevents))
|
||||
else null
|
||||
end as PaO2FiO2
|
||||
-- acid-base parameters
|
||||
, ph, baseexcess
|
||||
, bicarbonate, totalco2
|
||||
|
||||
-- blood count parameters
|
||||
, hematocrit
|
||||
, hemoglobin
|
||||
, carboxyhemoglobin
|
||||
, methemoglobin
|
||||
|
||||
-- chemistry
|
||||
, chloride, calcium
|
||||
, temperature
|
||||
, potassium, sodium
|
||||
, lactate
|
||||
, glucose
|
||||
|
||||
-- ventilation stuff that's sometimes input
|
||||
, intubated, tidalvolume, ventilationrate, ventilator
|
||||
, peep, o2flow
|
||||
, requiredo2
|
||||
|
||||
from stg3
|
||||
where lastRowFiO2 = 1 -- only the most recent FiO2
|
||||
-- restrict it to *only* arterial samples
|
||||
and (specimen = 'ART' or specimen_prob > 0.75)
|
||||
order by icustay_id, charttime;
|
||||
Reference in New Issue
Block a user