Chuyển đến nội dung chính

Bài 11: OBSERVATION — Sự kiện lâm sàng tổng hợp

Bảng OBSERVATION ghi nhận sự kiện lâm sàng không thuộc Condition, Drug, Procedure, hay Measurement. Tiền sử bệnh, lối sống, dị ứng, tiền sử gia đình, observation_event_id mới CDM 5.4.

🏗️ Kiến trúc — Bài 11 OBSERVATION Sự kiện lâm sàng tổng hợp OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z Phần 4: Bảng lâm sàng mở rộng xdev.asia

Giới thiệu

OBSERVATION là bảng "catch-all" — nơi lưu trữ mọi sự kiện lâm sàng không phù hợp với Condition, Drug, Procedure, hay Measurement. Tiền sử bệnh, lối sống (hút thuốc, uống rượu), dị ứng, tiền sử gia đình, tình trạng hôn nhân — tất cả đều nằm ở đây.


1. Cấu trúc bảng

CộtKiểuBắt buộcMô tả
observation_idINTEGER✅ PKID duy nhất
person_idINTEGER✅ FKBệnh nhân
observation_concept_idINTEGER✅Standard Concept
observation_dateDATE✅Ngày ghi nhận
observation_datetimeDATETIMENgày giờ
observation_type_concept_idINTEGER✅Nguồn dữ liệu
value_as_numberFLOATGiá trị số
value_as_stringVARCHAR(60)Giá trị text
value_as_concept_idINTEGERGiá trị danh mục
qualifier_concept_idINTEGERBổ sung ngữ cảnh
unit_concept_idINTEGERĐơn vị
provider_idINTEGERFKProvider ghi nhận
visit_occurrence_idINTEGERFKVisit liên quan
visit_detail_idINTEGERFKVisit detail
observation_source_valueVARCHAR(50)Mã gốc
observation_source_concept_idINTEGERConcept gốc
unit_source_valueVARCHAR(50)Đơn vị gốc
qualifier_source_valueVARCHAR(50)Qualifier gốc
value_as_datetimeDATETIME⭐ CDM 5.4
observation_event_idBIGINT⭐ CDM 5.4
obs_event_field_concept_idINTEGER⭐ CDM 5.4

2. Lưu gì vào OBSERVATION?

2.1. Danh sách use case

Use caseobservation_concept_idvalueVí dụ
Hút thuốc4275495 (Tobacco smoking)value_as_concept_id4298794 (Current smoker)
Dị ứng439224 (Allergy)value_as_concept_idConcept thuốc/thức ăn
Tiền sử gia đình4167217 (Family history of)value_as_concept_idConcept bệnh
Tình trạng hôn nhân4053609 (Marital status)value_as_concept_id4338692 (Married)
Nhóm máu4041671 (Blood type)value_as_concept_id36308332 (Type O)
Tiền sử bệnh4214956 (History of) + condition conceptvalue_as_concept_id
Thai kỳ4299535 (Pregnancy)value_as_concept_id
Nghề nghiệp4019962 (Occupation)value_as_string"Giáo viên"

2.2. OBSERVATION vs CONDITION — Khi nào lưu ở đâu?

Dữ liệuBảngGiải thích
"Bệnh nhân bị tiểu đường type 2"CONDITIONBệnh đang hoạt động
"Tiền sử tiểu đường gia đình"OBSERVATIONFamily history
"BN từng bị viêm gan B (đã khỏi)"OBSERVATIONHistory of
"Dị ứng Penicillin"OBSERVATIONAllergy
"BN hút thuốc 20 năm"OBSERVATIONLifestyle
"Sốt 38.5°C"MEASUREMENTCó giá trị đo

3. Ví dụ chi tiết

3.1. Hút thuốc

INSERT INTO observation (
    observation_id, person_id, observation_concept_id,
    observation_date, observation_type_concept_id,
    value_as_concept_id,
    observation_source_value
) VALUES (
    130001, 100001,
    4275495,                     -- Tobacco smoking behavior
    '2024-06-15', 32817,
    4298794,                     -- Current every day smoker
    'SMOKING_STATUS'
);

3.2. Dị ứng thuốc

-- Dị ứng Penicillin
INSERT INTO observation (
    observation_id, person_id, observation_concept_id,
    observation_date, observation_type_concept_id,
    value_as_concept_id,
    qualifier_concept_id,
    observation_source_value
) VALUES (
    130002, 100001,
    439224,                      -- Allergy to substance
    '2024-06-15', 32817,
    1713332,                     -- Penicillin (RxNorm ingredient)
    4129512,                     -- Severe (qualifier)
    'ALLERGY_PENICILLIN'
);

3.3. Tiền sử gia đình

-- Mẹ bị ung thư vú
INSERT INTO observation (
    observation_id, person_id, observation_concept_id,
    observation_date, observation_type_concept_id,
    value_as_concept_id,
    qualifier_concept_id,
    observation_source_value
) VALUES (
    130003, 100001,
    4167217,                     -- Family history of clinical finding
    '2024-06-15', 32817,
    4112853,                     -- Malignant neoplasm of breast
    4166847,                     -- Mother (qualifier)
    'FHX_BREAST_CANCER_MOTHER'
);

4. observation_event_id — CDM 5.4

Tương tự measurement_event_id, cho phép liên kết observation với event khác.

-- Ghi nhận: "Lý do nhập viện: Đau ngực"
-- Liên kết với visit_occurrence_id = 50001
INSERT INTO observation (
    observation_id, person_id, observation_concept_id,
    observation_date, observation_type_concept_id,
    value_as_concept_id,
    observation_event_id,
    obs_event_field_concept_id
) VALUES (
    130004, 100001,
    4148832,                     -- Chief complaint
    '2024-06-15', 32817,
    77670,                       -- Chest pain
    50001,                       -- visit_occurrence_id
    1147082                      -- Field = visit_occurrence.visit_occurrence_id
);

5. qualifier_concept_id — Bổ sung ngữ cảnh

Concept IDQualifierDùng cho
4129512SevereMức độ nặng
4148136MildMức độ nhẹ
4129511ModerateMức độ vừa
4166847MotherMối quan hệ gia đình
4166848FatherMối quan hệ gia đình
4192403SiblingAnh/chị/em
4167233First degree relativeHọ hàng bậc 1

6. ETL dữ liệu VN

-- Tiền sử từ HIS
SELECT
    ROW_NUMBER() OVER() AS observation_id,
    pm.person_id,
    COALESCE(stcm.target_concept_id, 0) AS observation_concept_id,
    ts.ngay_ghinhan AS observation_date,
    32817 AS observation_type_concept_id,
    -- Map giá trị
    CASE ts.loai_tiensu
        WHEN 'HUT_THUOC' THEN
            CASE ts.gia_tri
                WHEN 'CO' THEN 4298794     -- Current smoker
                WHEN 'DA_BO' THEN 4144272  -- Former smoker
                WHEN 'KHONG' THEN 4144273  -- Never smoker
            END
        WHEN 'DI_UNG' THEN
            COALESCE(stcm_drug.target_concept_id, 0)
    END AS value_as_concept_id,
    ts.mo_ta AS value_as_string,
    ts.ma_tiensu AS observation_source_value
FROM tiensu_his ts
JOIN person_mapping pm ON ts.ma_bn = pm.source_id
LEFT JOIN source_to_concept_map stcm
    ON ts.loai_tiensu = stcm.source_code
    AND stcm.source_vocabulary_id = 'VN_OBS_TYPE'
LEFT JOIN source_to_concept_map stcm_drug
    ON ts.gia_tri = stcm_drug.source_code
    AND stcm_drug.source_vocabulary_id = 'VN_DRUG';

7. SQL phân tích

-- Tỉ lệ hút thuốc theo giới tính
SELECT
    g.concept_name AS gender,
    s.concept_name AS smoking_status,
    COUNT(DISTINCT o.person_id) AS patients
FROM observation o
JOIN person p ON o.person_id = p.person_id
JOIN concept g ON p.gender_concept_id = g.concept_id
JOIN concept s ON o.value_as_concept_id = s.concept_id
WHERE o.observation_concept_id = 4275495  -- Tobacco smoking
GROUP BY g.concept_name, s.concept_name
ORDER BY g.concept_name, patients DESC;

-- Top dị ứng thuốc
SELECT
    c.concept_name AS allergen,
    COUNT(DISTINCT o.person_id) AS patients
FROM observation o
JOIN concept c ON o.value_as_concept_id = c.concept_id
WHERE o.observation_concept_id = 439224  -- Allergy
GROUP BY c.concept_name
ORDER BY patients DESC
LIMIT 10;

Tổng kết

  1. OBSERVATION = bảng "catch-all" cho dữ liệu không thuộc bảng chuyên biệt
  2. Use case chính: hút thuốc, dị ứng, tiền sử gia đình, lối sống, hôn nhân
  3. qualifier_concept_id thêm ngữ cảnh (mức độ, mối quan hệ)
  4. CDM 5.4: observation_event_id liên kết với event khác
  5. Domain routing quyết định Observation vs Condition vs Measurement

Bài tiếp theo: DEVICE_EXPOSURE, SPECIMEN & NOTE — thiết bị y tế, mẫu bệnh phẩm, và ghi chú lâm sàng.


Tài liệu tham khảo