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

Bài 8: DRUG_EXPOSURE — Thuốc, Kê đơn & Vaccine

Ghi nhận lịch sử dùng thuốc: kê đơn (prescription), cấp thuốc (dispensing), sử dụng thuốc (administration). Hiểu RxNorm vocab, quantity/days_supply/refills, route_concept_id, sig, liên kết DRUG_STRENGTH.

🏗️ Kiến trúc — Bài 8 DRUG_EXPOSURE Thuốc, Kê đơn & Vaccine OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z Phần 3: Sự kiện lâm sàng chính xdev.asia

Phân cấp thuốc: Ingredient → Clinical Drug → Branded Drug

Giới thiệu

DRUG_EXPOSURE là bảng ghi nhận mọi sự kiện liên quan đến thuốc — từ lúc bác sĩ kê đơn, nhà thuốc cấp phát, đến y tá tiêm truyền. Đây là bảng phức tạp nhất trong nhóm Clinical Data vì phải xử lý nhiều nguồn dữ liệu khác nhau: đơn thuốc ngoại trú, thuốc nội trú, vaccine, truyền dịch.


1. Cấu trúc bảng

CộtKiểuBắt buộcMô tả
drug_exposure_idINTEGER✅ PKID duy nhất
person_idINTEGER✅ FKBệnh nhân
drug_concept_idINTEGER✅Standard Concept (RxNorm)
drug_exposure_start_dateDATE✅Ngày bắt đầu
drug_exposure_start_datetimeDATETIMENgày giờ bắt đầu
drug_exposure_end_dateDATE✅Ngày kết thúc
drug_exposure_end_datetimeDATETIMENgày giờ kết thúc
verbatim_end_dateDATEEnd date gốc (trước suy luận)
drug_type_concept_idINTEGER✅Nguồn dữ liệu
stop_reasonVARCHAR(20)Lý do ngừng thuốc
refillsINTEGERSố lần refill
quantityFLOATSố lượng cấp phát
days_supplyINTEGERSố ngày cung cấp
sigCLOBHướng dẫn sử dụng gốc
route_concept_idINTEGERĐường dùng (uống, tiêm...)
lot_numberVARCHAR(50)Số lô (quan trọng cho vaccine)
provider_idINTEGERFKBác sĩ kê đơn
visit_occurrence_idINTEGERFKVisit liên quan
visit_detail_idINTEGERFKVisit detail
drug_source_valueVARCHAR(50)Mã thuốc gốc
drug_source_concept_idINTEGERConcept gốc
route_source_valueVARCHAR(50)Đường dùng gốc
dose_unit_source_valueVARCHAR(50)Đơn vị liều gốc

2. RxNorm — Vocabulary chuẩn cho thuốc

2.1. Cấu trúc phân cấp RxNorm

  ┌──────────────────────────────────────────┐
  │            Ingredient (IN)                │
  │        VD: Metformin (concept 1503297)    │
  │                                           │
  │   ┌── Clinical Drug Form (CDF) ──┐       │
  │   │  Metformin Oral Tablet        │       │
  │   │                               │       │
  │   │  ┌── Clinical Drug (CD) ──┐   │       │
  │   │  │ Metformin 500mg Tab    │   │       │
  │   │  │ (concept 1503328)      │   │       │
  │   │  └────────────────────────┘   │       │
  │   └───────────────────────────────┘       │
  │                                           │
  │   ┌── Branded Drug (BD) ────────┐         │
  │   │  Glucophage 500mg Tab       │         │
  │   └─────────────────────────────┘         │
  └───────────────────────────────────────────┘

2.2. Chọn đúng cấp RxNorm

LevelKhi nào dùngVí dụ
IngredientChỉ biết hoạt chất"Metformin"
Clinical DrugBiết hoạt chất + liều + dạng"Metformin 500mg Tablet"
Branded DrugBiết tên thương mại"Glucophage 500mg Tab"
Clinical Drug ComponentHoạt chất + liều (combo)"Metformin 500mg"

Khuyến nghị: Map ở mức Clinical Drug hoặc Branded Drug nếu có đủ thông tin. Nếu dữ liệu nguồn chỉ có tên hoạt chất, dùng Ingredient.


3. drug_type_concept_id — Nguồn dữ liệu

Concept IDTênUse case
32838EHR prescriptionĐơn thuốc từ HIS
32839EHR dispensingNhà thuốc cấp phát
32818EHR administrationY tá ghi nhận tiêm/truyền
32869Patient self-reportedBN tự khai thuốc đang dùng
32810ClaimDữ liệu BHXH

4. Tính days_supply và drug_exposure_end_date

4.1. Quy tắc CDM

drug_exposure_end_date =
    drug_exposure_start_date + days_supply - 1

4.2. Ví dụ tính toán

-- Kê đơn: Metformin 500mg x 2 viên/ngày x 30 ngày
INSERT INTO drug_exposure (
    drug_exposure_id, person_id, drug_concept_id,
    drug_exposure_start_date, drug_exposure_end_date,
    drug_type_concept_id,
    quantity, days_supply, refills,
    sig, route_concept_id,
    drug_source_value
) VALUES (
    80001, 100001, 1503328,         -- RxNorm: Metformin 500mg Tab
    '2024-06-01', '2024-06-30',     -- 30 days
    32838,                            -- EHR prescription
    60, 30, 2,                        -- 60 viên, 30 ngày, 2 refills
    'Uống 2 viên/ngày, sáng chiều sau ăn',
    4132161,                          -- Oral
    'METFORMIN500'
);

4.3. Truyền dịch / Tiêm

-- Truyền NaCl 0.9% 500ml trong 2 giờ
INSERT INTO drug_exposure (
    drug_exposure_id, person_id, drug_concept_id,
    drug_exposure_start_date, drug_exposure_start_datetime,
    drug_exposure_end_date, drug_exposure_end_datetime,
    drug_type_concept_id,
    quantity, days_supply,
    route_concept_id,
    drug_source_value
) VALUES (
    80002, 100001, 19049105,         -- RxNorm: NaCl 0.9% Injectable
    '2024-06-10', '2024-06-10 08:00:00',
    '2024-06-10', '2024-06-10 10:00:00',
    32818,                            -- EHR administration
    500, 1,                           -- 500ml, 1 ngày
    4171047,                          -- Intravenous
    'NACL09_500'
);

5. route_concept_id — Đường dùng thuốc

Concept IDRouteTiếng Việt
4132161OralUống
4171047IntravenousTiêm tĩnh mạch
4302612IntramuscularTiêm bắp
4142048SubcutaneousTiêm dưới da
4186838TopicalBôi ngoài da
4290759InhaledHít / khí dung
4163768RectalTrực tràng
4186747OphthalmicNhỏ mắt

6. Vaccine trong DRUG_EXPOSURE

Vaccine cũng lưu trong DRUG_EXPOSURE, không có bảng riêng.

-- Tiêm vaccine COVID-19 (Pfizer) — liều 1
INSERT INTO drug_exposure (
    drug_exposure_id, person_id, drug_concept_id,
    drug_exposure_start_date, drug_exposure_end_date,
    drug_type_concept_id,
    quantity, days_supply,
    route_concept_id, lot_number,
    drug_source_value
) VALUES (
    80003, 100001, 37003436,         -- CVX: COVID-19 vaccine Pfizer
    '2024-03-15', '2024-03-15',      -- Tiêm 1 lần
    32818,                            -- Administration
    1, 1,
    4302612,                          -- Intramuscular
    'FK1234',                         -- Số lô vaccine
    'COVID19_PFIZER_DOSE1'
);

Lưu ý lot_number: Đặc biệt quan trọng cho vaccine — dùng để trace lô nếu có adverse event.


7. ETL thuốc Việt Nam

7.1. Vấn đề phổ biến

Vấn đềGiải pháp
HIS dùng mã riêngMap qua SOURCE_TO_CONCEPT_MAP
Tên thuốc tiếng ViệtUsagi mapping tool
Thuốc combo (Metformin + Glipizide)Map về RxNorm combo concept
Không biết liều/dạngMap về Ingredient level
Thuốc đông y / thuốc namconcept_id = 0, giữ source_value

7.2. Ví dụ ETL

SELECT
    ROW_NUMBER() OVER() AS drug_exposure_id,
    pm.person_id,
    COALESCE(cr.concept_id_2, 0) AS drug_concept_id,
    dt.ngay_ke AS drug_exposure_start_date,
    dt.ngay_ke + dt.so_ngay - 1 AS drug_exposure_end_date,
    32838 AS drug_type_concept_id,
    dt.so_luong AS quantity,
    dt.so_ngay AS days_supply,
    dt.so_lan_tai_ke AS refills,
    dt.huong_dan_su_dung AS sig,
    COALESCE(r.concept_id, 0) AS route_concept_id,
    dt.ma_thuoc AS drug_source_value,
    COALESCE(c_source.concept_id, 0) AS drug_source_concept_id,
    dt.duong_dung_goc AS route_source_value,
    dt.don_vi_lieu AS dose_unit_source_value
FROM donthuoc_his dt
JOIN person_mapping pm ON dt.ma_bn = pm.source_id
LEFT JOIN source_to_concept_map stcm
    ON dt.ma_thuoc = stcm.source_code
    AND stcm.source_vocabulary_id = 'VN_DRUG'
LEFT JOIN concept c_std
    ON stcm.target_concept_id = c_std.concept_id
    AND c_std.standard_concept = 'S'
LEFT JOIN concept c_source
    ON dt.ma_thuoc = c_source.concept_code
LEFT JOIN concept_relationship cr
    ON c_source.concept_id = cr.concept_id_1
    AND cr.relationship_id = 'Maps to'
LEFT JOIN concept r
    ON dt.duong_dung_goc = r.concept_name
    AND r.domain_id = 'Route';

8. Liên kết với DRUG_STRENGTH

Bảng DRUG_STRENGTH (trong Vocabularies) chứa thông tin liều lượng chi tiết:

-- Tra liều Metformin 500mg Tablet
SELECT
    ds.drug_concept_id,
    c_drug.concept_name AS drug_name,
    ds.ingredient_concept_id,
    c_ing.concept_name AS ingredient_name,
    ds.amount_value,
    c_unit.concept_name AS amount_unit
FROM drug_strength ds
JOIN concept c_drug ON ds.drug_concept_id = c_drug.concept_id
JOIN concept c_ing ON ds.ingredient_concept_id = c_ing.concept_id
LEFT JOIN concept c_unit ON ds.amount_unit_concept_id = c_unit.concept_id
WHERE ds.drug_concept_id = 1503328;
-- Kết quả: Metformin 500 mg

9. SQL phân tích

-- Top 10 thuốc được kê nhiều nhất
SELECT
    c.concept_name AS drug_name,
    COUNT(DISTINCT de.person_id) AS patient_count,
    COUNT(*) AS prescription_count
FROM drug_exposure de
JOIN concept c ON de.drug_concept_id = c.concept_id
WHERE de.drug_concept_id != 0
GROUP BY c.concept_name
ORDER BY patient_count DESC
LIMIT 10;

-- Polypharmacy: BN dùng >= 5 thuốc cùng lúc
SELECT
    de.person_id,
    COUNT(DISTINCT de.drug_concept_id) AS concurrent_drugs
FROM drug_exposure de
WHERE de.drug_exposure_start_date <= '2024-06-01'
  AND de.drug_exposure_end_date >= '2024-06-01'
GROUP BY de.person_id
HAVING COUNT(DISTINCT de.drug_concept_id) >= 5
ORDER BY concurrent_drugs DESC;

Tổng kết

  1. DRUG_EXPOSURE = kê đơn + cấp phát + tiêm truyền + vaccine
  2. drug_concept_id dùng RxNorm (Ingredient → Clinical Drug → Branded Drug)
  3. days_supply + quantity + refills tạo bức tranh đầy đủ
  4. route_concept_id cho đường dùng, lot_number cho vaccine
  5. drug_type_concept_id phân biệt prescription vs dispensing vs administration
  6. ETL VN: mapping qua SOURCE_TO_CONCEPT_MAP hoặc Usagi

Bài tiếp theo: PROCEDURE_OCCURRENCE — thủ thuật, phẫu thuật, và can thiệp.


Tài liệu tham khảo