study_combined_dashboard_participant_metrics_view

Column Type
tenant_id VARCHAR
study_id TEXT
participant_id TEXT
gender TEXT
age TEXT
study_arm TEXT
baseline_hba1c TEXT
cgm_devices
cgm_files
tir
tar_vh
tar_h
tbr_l
tbr_vl
tar
tbr
gmi
percent_gv
gri
days_of_wear
data_start_date
data_end_date
wear_time_percentage

SQL DDL

CREATE VIEW study_combined_dashboard_participant_metrics_view AS
WITH participant_data AS (
    SELECT 
        dg.tenant_id,
        dg.study_id,             
        dg.participant_id,
        dg.gender,
        dg.age,
        dg.study_arm,
        dg.baseline_hba1c,
        GROUP_CONCAT(DISTINCT cfm.devicename) AS cgm_devices,
        GROUP_CONCAT(DISTINCT cfm.file_name || '.' || cfm.file_format) AS cgm_files
    FROM drh_participant dg 
    LEFT JOIN uniform_resource_cgm_file_metadata cfm 
        ON dg.participant_id = cfm.patient_id
    GROUP BY dg.study_id, dg.tenant_id, dg.participant_id
),
cgm_metrics AS (
    SELECT
        dc.participant_id,
        ROUND(SUM(CASE WHEN dc.CGM_Value BETWEEN 70 AND 180 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tir,
        ROUND(SUM(CASE WHEN dc.CGM_Value > 250 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tar_vh,
        ROUND(SUM(CASE WHEN dc.CGM_Value BETWEEN 181 AND 250 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tar_h,
        ROUND(SUM(CASE WHEN dc.CGM_Value BETWEEN 54 AND 69 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tbr_l,
        ROUND(SUM(CASE WHEN dc.CGM_Value < 54 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tbr_vl,
        ROUND(SUM(CASE WHEN dc.CGM_Value > 180 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tar,
        ROUND(SUM(CASE WHEN dc.CGM_Value < 70 THEN 1 ELSE 0 END) * 1.0 / COUNT(dc.CGM_Value) * 100, 2) AS tbr,
        CEIL((AVG(dc.CGM_Value) * 0.155) + 95) AS gmi,
        ROUND((SQRT(AVG(dc.CGM_Value * dc.CGM_Value) - AVG(dc.CGM_Value) * AVG(dc.CGM_Value)) / AVG(dc.CGM_Value)) * 100, 2) AS percent_gv,
        ROUND((3.0 * ((SUM(CASE WHEN dc.CGM_Value < 54 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) + 
                      (0.8 * (SUM(CASE WHEN dc.CGM_Value BETWEEN 54 AND 69 THEN 1 ELSE 0 END) * 100.0 / COUNT(*))))) + 
              (1.6 * ((SUM(CASE WHEN dc.CGM_Value > 250 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) + 
                      (0.5 * (SUM(CASE WHEN dc.CGM_Value BETWEEN 181 AND 250 THEN 1 ELSE 0 END) * 100.0 / COUNT(*))))), 2) AS gri,
        COUNT(DISTINCT DATE(dc.Date_Time)) AS days_of_wear,
        MIN(DATE(dc.Date_Time)) AS data_start_date,
        MAX(DATE(dc.Date_Time)) AS data_end_date,
        ROUND(
            COALESCE(
                (COUNT(DISTINCT DATE(dc.Date_Time)) * 1.0 / 
                (JULIANDAY(MAX(DATE(dc.Date_Time))) - JULIANDAY(MIN(DATE(dc.Date_Time))) + 1)) * 100, 
                0), 
            2) AS wear_time_percentage
    FROM combined_cgm_tracing dc
    GROUP BY dc.participant_id
)
SELECT 
    pd.tenant_id,
    pd.study_id,
    pd.participant_id,
    pd.gender,
    pd.age,
    pd.study_arm,
    pd.baseline_hba1c,
    pd.cgm_devices,
    pd.cgm_files,
    cm.tir,
    cm.tar_vh,
    cm.tar_h,
    cm.tbr_l,
    cm.tbr_vl,
    cm.tar,
    cm.tbr,
    cm.gmi,
    cm.percent_gv,
    cm.gri,
    cm.days_of_wear,
    cm.data_start_date,
    cm.data_end_date,
    cm.wear_time_percentage
FROM participant_data pd
JOIN cgm_metrics cm ON pd.participant_id = cm.participant_id
ORDER BY     
    CASE 
        WHEN LENGTH(pd.participant_id) - LENGTH(REPLACE(pd.participant_id, '-', '')) = 1 THEN 
            CAST(SUBSTR(pd.participant_id, INSTR(pd.participant_id, '-') + 1) AS INTEGER) 
        ELSE pd.participant_id 
    END ASC