initial
This commit is contained in:
143
sql/firstday/gcs_first_day.sql
Normal file
143
sql/firstday/gcs_first_day.sql
Normal file
@@ -0,0 +1,143 @@
|
||||
-- THIS SCRIPT IS AUTOMATICALLY GENERATED. DO NOT EDIT IT DIRECTLY.
|
||||
DROP TABLE IF EXISTS gcs_first_day; CREATE TABLE gcs_first_day AS
|
||||
-- ITEMIDs used:
|
||||
|
||||
-- CAREVUE
|
||||
-- 723 as GCSVerbal
|
||||
-- 454 as GCSMotor
|
||||
-- 184 as GCSEyes
|
||||
|
||||
-- METAVISION
|
||||
-- 223900 GCS - Verbal Response
|
||||
-- 223901 GCS - Motor Response
|
||||
-- 220739 GCS - Eye Opening
|
||||
|
||||
-- The code combines the ITEMIDs into the carevue itemids, then pivots those
|
||||
-- So 223900 is changed to 723, then the ITEMID 723 is pivoted to form GCSVerbal
|
||||
|
||||
-- Note:
|
||||
-- The GCS for sedated patients is defaulted to 15 in this code.
|
||||
-- This is in line with how the data is meant to be collected.
|
||||
-- e.g., from the SAPS II publication:
|
||||
-- For sedated patients, the Glasgow Coma Score before sedation was used.
|
||||
-- This was ascertained either from interviewing the physician who ordered the sedation,
|
||||
-- or by reviewing the patient's medical record.
|
||||
|
||||
with base as
|
||||
(
|
||||
SELECT pvt.ICUSTAY_ID
|
||||
, pvt.charttime
|
||||
|
||||
-- Easier names - note we coalesced Metavision and CareVue IDs below
|
||||
, max(case when pvt.itemid = 454 then pvt.valuenum else null end) as GCSMotor
|
||||
, max(case when pvt.itemid = 723 then pvt.valuenum else null end) as GCSVerbal
|
||||
, max(case when pvt.itemid = 184 then pvt.valuenum else null end) as GCSEyes
|
||||
|
||||
-- If verbal was set to 0 in the below select, then this is an intubated patient
|
||||
, case
|
||||
when max(case when pvt.itemid = 723 then pvt.valuenum else null end) = 0
|
||||
then 1
|
||||
else 0
|
||||
end as EndoTrachFlag
|
||||
|
||||
, ROW_NUMBER ()
|
||||
OVER (PARTITION BY pvt.ICUSTAY_ID ORDER BY pvt.charttime ASC) as rn
|
||||
|
||||
FROM (
|
||||
select l.ICUSTAY_ID
|
||||
-- merge the ITEMIDs so that the pivot applies to both metavision/carevue data
|
||||
, case
|
||||
when l.ITEMID in (723,223900) then 723
|
||||
when l.ITEMID in (454,223901) then 454
|
||||
when l.ITEMID in (184,220739) then 184
|
||||
else l.ITEMID end
|
||||
as ITEMID
|
||||
|
||||
-- convert the data into a number, reserving a value of 0 for ET/Trach
|
||||
, case
|
||||
-- endotrach/vent is assigned a value of 0, later parsed specially
|
||||
when l.ITEMID = 723 and l.VALUE = '1.0 ET/Trach' then 0 -- carevue
|
||||
when l.ITEMID = 223900 and l.VALUE = 'No Response-ETT' then 0 -- metavision
|
||||
|
||||
else VALUENUM
|
||||
end
|
||||
as VALUENUM
|
||||
, l.CHARTTIME
|
||||
FROM chartevents l
|
||||
|
||||
-- get intime for charttime subselection
|
||||
inner join icustays b
|
||||
on l.icustay_id = b.icustay_id
|
||||
|
||||
-- Isolate the desired GCS variables
|
||||
where l.ITEMID in
|
||||
(
|
||||
-- 198 -- GCS
|
||||
-- GCS components, CareVue
|
||||
184, 454, 723
|
||||
-- GCS components, Metavision
|
||||
, 223900, 223901, 220739
|
||||
)
|
||||
-- Only get data for the first 24 hours
|
||||
and l.charttime between b.intime and DATETIME_ADD(b.intime, INTERVAL '1' DAY)
|
||||
-- exclude rows marked as error
|
||||
AND (l.error IS NULL OR l.error = 0)
|
||||
) pvt
|
||||
group by pvt.ICUSTAY_ID, pvt.charttime
|
||||
)
|
||||
, gcs as (
|
||||
select b.*
|
||||
, b2.GCSVerbal as GCSVerbalPrev
|
||||
, b2.GCSMotor as GCSMotorPrev
|
||||
, b2.GCSEyes as GCSEyesPrev
|
||||
-- Calculate GCS, factoring in special case when they are intubated and prev vals
|
||||
-- note that the coalesce are used to implement the following if:
|
||||
-- if current value exists, use it
|
||||
-- if previous value exists, use it
|
||||
-- otherwise, default to normal
|
||||
, case
|
||||
-- replace GCS during sedation with 15
|
||||
when b.GCSVerbal = 0
|
||||
then 15
|
||||
when b.GCSVerbal is null and b2.GCSVerbal = 0
|
||||
then 15
|
||||
-- if previously they were intub, but they aren't now, do not use previous GCS values
|
||||
when b2.GCSVerbal = 0
|
||||
then
|
||||
coalesce(b.GCSMotor,6)
|
||||
+ coalesce(b.GCSVerbal,5)
|
||||
+ coalesce(b.GCSEyes,4)
|
||||
-- otherwise, add up score normally, imputing previous value if none available at current time
|
||||
else
|
||||
coalesce(b.GCSMotor,coalesce(b2.GCSMotor,6))
|
||||
+ coalesce(b.GCSVerbal,coalesce(b2.GCSVerbal,5))
|
||||
+ coalesce(b.GCSEyes,coalesce(b2.GCSEyes,4))
|
||||
end as GCS
|
||||
|
||||
from base b
|
||||
-- join to itself within 6 hours to get previous value
|
||||
left join base b2
|
||||
on b.ICUSTAY_ID = b2.ICUSTAY_ID and b.rn = b2.rn+1 and b2.charttime > DATETIME_SUB(b.charttime, INTERVAL '6' HOUR)
|
||||
)
|
||||
, gcs_final as (
|
||||
select gcs.*
|
||||
-- This sorts the data by GCS, so rn=1 is the the lowest GCS values to keep
|
||||
, ROW_NUMBER ()
|
||||
OVER (PARTITION BY gcs.ICUSTAY_ID
|
||||
ORDER BY gcs.GCS
|
||||
) as IsMinGCS
|
||||
from gcs
|
||||
)
|
||||
select ie.subject_id, ie.hadm_id, ie.icustay_id
|
||||
-- The minimum GCS is determined by the above row partition, we only join if IsMinGCS=1
|
||||
, GCS as mingcs
|
||||
, coalesce(GCSMotor,GCSMotorPrev) as gcsmotor
|
||||
, coalesce(GCSVerbal,GCSVerbalPrev) as gcsverbal
|
||||
, coalesce(GCSEyes,GCSEyesPrev) as gcseyes
|
||||
, EndoTrachFlag as endotrachflag
|
||||
|
||||
-- subselect down to the cohort of eligible patients
|
||||
FROM icustays ie
|
||||
left join gcs_final gs
|
||||
on ie.icustay_id = gs.icustay_id and gs.IsMinGCS = 1
|
||||
ORDER BY ie.icustay_id;
|
||||
Reference in New Issue
Block a user