144 lines
4.8 KiB
SQL
144 lines
4.8 KiB
SQL
-- 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;
|