-- ============================================================
-- ADS 层（应用数据层）建表语句
-- 说明：患者检查周期全量宽表，以末次取镜时间为中心点
-- ============================================================

-- 患者检查周期宽表事实表
CREATE TABLE IF NOT EXISTS fact_patient_exam_wide (
    -- 患者基本信息
    patient_id BIGINT COMMENT '患者ID',
    patient_id_str VARCHAR(50) COMMENT '病历号',
    patient_name VARCHAR(100) COMMENT '姓名',
    sex VARCHAR(10) COMMENT '性别',
    age INT COMMENT '年龄',
    birthday DATE COMMENT '生日',
    mobile VARCHAR(20) COMMENT '手机号',
    identity VARCHAR(50) COMMENT '身份证号',

    -- 商品和视光师信息
    fee_class VARCHAR(50) COMMENT '收费分类',
    customer_optometrist_name VARCHAR(100) COMMENT '专属视光师',
    customer_optometrist_org_name VARCHAR(200) COMMENT '专属视光师归属机构',
    last_pickup_time DATETIME COMMENT '末次取镜时间',
    last_pickup_date DATE COMMENT '末次取镜日期',
    last_pickup_goods VARCHAR(200) COMMENT '末次取镜商品名称',
    last_pickup_goods_id BIGINT COMMENT '末次取镜商品ID',

    -- 购买统计
    buy_cnt INT COMMENT '购买片数',
    refund_cnt INT COMMENT '退货片数',
    is_both_bs_xq TINYINT COMMENT '是否同时购买铂视控和星趣控：0=否，1=是',

    -- 基线时间
    baseline_date DATE COMMENT '基线时间',
    baseline_org_id INT COMMENT '基线检查机构ID',
    baseline_org_name VARCHAR(200) COMMENT '基线检查机构名称',

    -- 基线检查数据
    baseline_right_se_val DECIMAL(10,2) COMMENT '基线右眼SE等效球镜',
    baseline_left_se_val DECIMAL(10,2) COMMENT '基线左眼SE等效球镜',
    baseline_right_sph_val DECIMAL(10,2) COMMENT '基线右眼球镜',
    baseline_left_sph_val DECIMAL(10,2) COMMENT '基线左眼球镜',
    baseline_al_od_val DECIMAL(10,2) COMMENT '基线右眼眼轴',
    baseline_al_os_val DECIMAL(10,2) COMMENT '基线左眼眼轴',

    -- 1个月前检查数据
    m1_right_se_val DECIMAL(10,2) COMMENT '1个月前右眼SE等效球镜',
    m1_left_se_val DECIMAL(10,2) COMMENT '1个月前左眼SE等效球镜',
    m1_right_sph_val DECIMAL(10,2) COMMENT '1个月前右眼球镜',
    m1_left_sph_val DECIMAL(10,2) COMMENT '1个月前左眼球镜',
    m1_al_od_val DECIMAL(10,2) COMMENT '1个月前右眼眼轴',
    m1_al_os_val DECIMAL(10,2) COMMENT '1个月前左眼眼轴',

    -- 3个月前检查数据
    m3_right_se_val DECIMAL(10,2) COMMENT '3个月前右眼SE等效球镜',
    m3_left_se_val DECIMAL(10,2) COMMENT '3个月前左眼SE等效球镜',
    m3_right_sph_val DECIMAL(10,2) COMMENT '3个月前右眼球镜',
    m3_left_sph_val DECIMAL(10,2) COMMENT '3个月前左眼球镜',
    m3_al_od_val DECIMAL(10,2) COMMENT '3个月前右眼眼轴',
    m3_al_os_val DECIMAL(10,2) COMMENT '3个月前左眼眼轴',

    -- 6个月前检查数据
    m6_right_se_val DECIMAL(10,2) COMMENT '6个月前右眼SE等效球镜',
    m6_left_se_val DECIMAL(10,2) COMMENT '6个月前左眼SE等效球镜',
    m6_right_sph_val DECIMAL(10,2) COMMENT '6个月前右眼球镜',
    m6_left_sph_val DECIMAL(10,2) COMMENT '6个月前左眼球镜',
    m6_al_od_val DECIMAL(10,2) COMMENT '6个月前右眼眼轴',
    m6_al_os_val DECIMAL(10,2) COMMENT '6个月前左眼眼轴',

    -- 1个月后检查数据
    p1_right_se_val DECIMAL(10,2) COMMENT '1个月后右眼SE等效球镜',
    p1_left_se_val DECIMAL(10,2) COMMENT '1个月后左眼SE等效球镜',
    p1_right_sph_val DECIMAL(10,2) COMMENT '1个月后右眼球镜',
    p1_left_sph_val DECIMAL(10,2) COMMENT '1个月后左眼球镜',
    p1_al_od_val DECIMAL(10,2) COMMENT '1个月后右眼眼轴',
    p1_al_os_val DECIMAL(10,2) COMMENT '1个月后左眼眼轴',

    -- 3个月后检查数据
    p3_right_se_val DECIMAL(10,2) COMMENT '3个月后右眼SE等效球镜',
    p3_left_se_val DECIMAL(10,2) COMMENT '3个月后左眼SE等效球镜',
    p3_right_sph_val DECIMAL(10,2) COMMENT '3个月后右眼球镜',
    p3_left_sph_val DECIMAL(10,2) COMMENT '3个月后左眼球镜',
    p3_al_od_val DECIMAL(10,2) COMMENT '3个月后右眼眼轴',
    p3_al_os_val DECIMAL(10,2) COMMENT '3个月后左眼眼轴',

    -- 6个月后检查数据
    p6_right_se_val DECIMAL(10,2) COMMENT '6个月后右眼SE等效球镜',
    p6_left_se_val DECIMAL(10,2) COMMENT '6个月后左眼SE等效球镜',
    p6_right_sph_val DECIMAL(10,2) COMMENT '6个月后右眼球镜',
    p6_left_sph_val DECIMAL(10,2) COMMENT '6个月后左眼球镜',
    p6_al_od_val DECIMAL(10,2) COMMENT '6个月后右眼眼轴',
    p6_al_os_val DECIMAL(10,2) COMMENT '6个月后左眼眼轴',

    -- 9个月后检查数据
    p9_right_se_val DECIMAL(10,2) COMMENT '9个月后右眼SE等效球镜',
    p9_left_se_val DECIMAL(10,2) COMMENT '9个月后左眼SE等效球镜',
    p9_right_sph_val DECIMAL(10,2) COMMENT '9个月后右眼球镜',
    p9_left_sph_val DECIMAL(10,2) COMMENT '9个月后左眼球镜',
    p9_al_od_val DECIMAL(10,2) COMMENT '9个月后右眼眼轴',
    p9_al_os_val DECIMAL(10,2) COMMENT '9个月后左眼眼轴',

    -- 1年后检查数据
    y1_right_se_val DECIMAL(10,2) COMMENT '1年后右眼SE等效球镜',
    y1_left_se_val DECIMAL(10,2) COMMENT '1年后左眼SE等效球镜',
    y1_right_sph_val DECIMAL(10,2) COMMENT '1年后右眼球镜',
    y1_left_sph_val DECIMAL(10,2) COMMENT '1年后左眼球镜',
    y1_al_od_val DECIMAL(10,2) COMMENT '1年后右眼眼轴',
    y1_al_os_val DECIMAL(10,2) COMMENT '1年后左眼眼轴',

    -- 15个月后检查数据
    p15_right_se_val DECIMAL(10,2) COMMENT '15个月后右眼SE等效球镜',
    p15_left_se_val DECIMAL(10,2) COMMENT '15个月后左眼SE等效球镜',
    p15_right_sph_val DECIMAL(10,2) COMMENT '15个月后右眼球镜',
    p15_left_sph_val DECIMAL(10,2) COMMENT '15个月后左眼球镜',
    p15_al_od_val DECIMAL(10,2) COMMENT '15个月后右眼眼轴',
    p15_al_os_val DECIMAL(10,2) COMMENT '15个月后左眼眼轴',

    -- 18个月后检查数据
    p18_right_se_val DECIMAL(10,2) COMMENT '18个月后右眼SE等效球镜',
    p18_left_se_val DECIMAL(10,2) COMMENT '18个月后左眼SE等效球镜',
    p18_right_sph_val DECIMAL(10,2) COMMENT '18个月后右眼球镜',
    p18_left_sph_val DECIMAL(10,2) COMMENT '18个月后左眼球镜',
    p18_al_od_val DECIMAL(10,2) COMMENT '18个月后右眼眼轴',
    p18_al_os_val DECIMAL(10,2) COMMENT '18个月后左眼眼轴',

    -- 2年后检查数据
    y2_right_se_val DECIMAL(10,2) COMMENT '2年后右眼SE等效球镜',
    y2_left_se_val DECIMAL(10,2) COMMENT '2年后左眼SE等效球镜',
    y2_right_sph_val DECIMAL(10,2) COMMENT '2年后右眼球镜',
    y2_left_sph_val DECIMAL(10,2) COMMENT '2年后左眼球镜',
    y2_al_od_val DECIMAL(10,2) COMMENT '2年后右眼眼轴',
    y2_al_os_val DECIMAL(10,2) COMMENT '2年后左眼眼轴',

    -- 数据日期（用于分区和管理）
    data_date DATE COMMENT '数据日期（末次取镜日期）',

    -- 元数据
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)
UNIQUE KEY (patient_id, data_date)
PROPERTIES (
    "replication_num" = "1",
    "in_memory" = "false",
    "storage_format" = "V2"
);

-- 按数据日期分区（可选，根据数据量决定）
-- ALTER TABLE fact_patient_exam_wide
-- ADD PARTITION BY RANGE(`data_date`) (
--     PARTITION p202401 VALUES LESS THAN ('2024-02-01'),
--     PARTITION p202402 VALUES LESS THAN ('2024-03-01'),
--     ...
-- );

-- 创建常用查询的 Rollup（提升查询性能）
-- ALTER TABLE fact_patient_exam_wide
-- ADD ROLLUP recent_data (
--     patient_id, patient_name, mobile,
--     baseline_right_se_val, baseline_left_se_val,
--     m3_right_se_val, m3_left_se_val,
--     p3_right_se_val, p3_left_se_val,
--     p6_right_se_val, p6_left_se_val
-- );
