zhaobo 5e2376f38e 更新定时脚本 1 ヶ月 前
..
01_create_ods_tables.sql 5e2376f38e 更新定时脚本 1 ヶ月 前
02_create_dwd_tables.sql 5e2376f38e 更新定时脚本 1 ヶ月 前
03_create_ads_tables.sql 5e2376f38e 更新定时脚本 1 ヶ月 前
README.md 5e2376f38e 更新定时脚本 1 ヶ月 前
实施指南.md 5e2376f38e 更新定时脚本 1 ヶ月 前

README.md

患者检查数据仓库建表说明

📁 文件说明

文件 说明
01_create_ods_tables.sql ODS 层(原始数据层)建表语句
02_create_dwd_tables.sql DWD 层(明细数据层)建表语句
03_create_ads_tables.sql ADS 层(应用数据层)建表语句

🗄️ 表结构概览

ODS 层(原始数据层)

MySQL 原表的镜像,结构完全一致,加 ods_ 前缀:

表名 说明 同步频率
ods_patient_custome 患者表 每天增量
ods_clinic_clinic 就诊表 每天增量
ods_exam_examresult 检查结果表 每天增量
ods_treat_sellgoods 取镜记录表 每天增量
ods_material_goods 商品表 每天全量
ods_fee_order 订单表 每天增量
ods_fee_orderdetail 订单明细表 每天增量
ods_staff_staff 员工表 每天全量
ods_org_org 机构表 每天全量

字段说明

  • 所有表都有 create_timeupdate_time(Doris 记录)
  • source_create_timesource_update_time(MySQL 源表时间)

DWD 层(明细数据层)

表名 说明 生成方式
fact_patient_exam_detail 患者就诊明细事实表 Doris 内部关联 ODS 表

数据来源

  • ods_clinic_clinic(就诊记录)
  • ods_patient_custome(患者信息)
  • ods_exam_examresult(检查结果)
  • ods_treat_sellgoods(取镜记录)
  • ods_material_goods(商品信息)
  • ods_fee_order(订单信息)
  • ods_staff_staff(员工信息)
  • ods_org_org(机构信息)

ADS 层(应用数据层)

表名 说明 生成方式
fact_patient_exam_wide 患者检查周期宽表 Doris 内部计算 DWD 表

宽表结构

  • 以末次取镜时间为中心点
  • 包含基线、前后多个周期的检查数据
  • 每个患者每天一条记录(按末次取镜日期)

🚀 使用步骤

1. 创建表

# 连接 Doris
mysql -h 127.0.0.1 -P 9030 -u root -p

# 使用数据库
USE bolin_prd;

# 按顺序执行建表语句
source sql/patient_exam/01_create_ods_tables.sql
source sql/patient_exam/02_create_dwd_tables.sql
source sql/patient_exam/03_create_ads_tables.sql

2. 验证表结构

-- 查看 ODS 层表
SHOW TABLES LIKE 'ods_%';

-- 查看 DWD 层表
SHOW TABLES LIKE 'fact_patient_exam_detail';

-- 查看 ADS 层表
SHOW TABLES LIKE 'fact_patient_exam_wide';

-- 查看表结构
DESC ods_patient_custome;
DESC fact_patient_exam_detail;
DESC fact_patient_exam_wide;

3. 启动同步任务

# 进入项目目录
cd E:\公司\BI1.0\doris_sync

# 查看任务列表
python main.py jobs

# 手动运行 ODS 层同步(测试)
python main.py run ods_patient_exam_sync

📊 字段命名规范

所有表都遵循以下规范:

字段类型 命名规则 示例
主键 id id
业务ID xxx_id patient_id, clinic_id
名称 xxx_name patient_name, org_name
金额 xxx_amt pay_amt, total_amt
数量 xxx_cnt buy_cnt, refund_cnt
日期 xxx_date come_date, pickup_date
时间 xxx_time create_time, update_time
xxx_val right_se_val, al_od_val
标识 is_xxx is_both_bs_xq
类型 xxx_type visit_type, fee_class

所有表都有 create_timeupdate_time 字段。

⚙️ 配置说明

数据同步策略

  • ODS 层:每天凌晨1点,增量同步昨天的数据
  • DWD 层:每天凌晨2点,在 Doris 内部关联生成
  • ADS 层:每天凌晨3点,增量更新;每周日凌晨3点,更新最近90天;每月1号凌晨4点,全量重建

分区策略(可选)

当数据量增大时,可以对 fact_patient_exam_wide 表进行分区:

-- 按数据日期(末次取镜日期)分区
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'),
    PARTITION p202403 VALUES LESS THAN ('2024-04-01'),
    PARTITION p202404 VALUES LESS THAN ('2024-05-01')
);

Rollup 优化(可选)

为常用查询创建 Rollup 提升性能:

ALTER TABLE fact_patient_exam_wide
ADD ROLLUP recent_data (
    patient_id, patient_name, mobile,
    baseline_right_se_val, baseline_left_se_val,
    p3_right_se_val, p3_left_se_val,
    p6_right_se_val, p6_left_se_val
);

🔍 常用查询

-- 查询某个患者的检查数据
SELECT * FROM fact_patient_exam_wide
WHERE patient_id_str = 'P123456';

-- 查询最近取镜的患者
SELECT * FROM fact_patient_exam_wide
ORDER BY last_pickup_time DESC
LIMIT 100;

-- 查询某个收费分类的患者
SELECT * FROM fact_patient_exam_wide
WHERE fee_class = '离焦镜片'
AND last_pickup_date >= '2024-01-01';

-- 统计基线数据完整度
SELECT
    COUNT(*) as total_cnt,
    COUNT(baseline_right_se_val) as has_baseline_se_cnt,
    COUNT(baseline_al_od_val) as has_baseline_al_cnt,
    COUNT(*) - COUNT(baseline_right_se_val) as missing_baseline_se_cnt
FROM fact_patient_exam_wide
WHERE last_pickup_date >= '2024-01-01';