|
|
1 miesiąc temu | |
|---|---|---|
| .. | ||
| 01_create_ods_tables.sql | 1 miesiąc temu | |
| 02_create_dwd_tables.sql | 1 miesiąc temu | |
| 03_create_ads_tables.sql | 1 miesiąc temu | |
| README.md | 1 miesiąc temu | |
| 实施指南.md | 1 miesiąc temu | |
| 文件 | 说明 |
|---|---|
01_create_ods_tables.sql |
ODS 层(原始数据层)建表语句 |
02_create_dwd_tables.sql |
DWD 层(明细数据层)建表语句 |
03_create_ads_tables.sql |
ADS 层(应用数据层)建表语句 |
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_time 和 update_time(Doris 记录)source_create_time 和 source_update_time(MySQL 源表时间)| 表名 | 说明 | 生成方式 |
|---|---|---|
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(机构信息)| 表名 | 说明 | 生成方式 |
|---|---|---|
fact_patient_exam_wide |
患者检查周期宽表 | Doris 内部计算 DWD 表 |
宽表结构:
# 连接 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
-- 查看 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;
# 进入项目目录
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_time 和 update_time 字段。
当数据量增大时,可以对 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 提升性能:
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';