
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ột | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
drug_exposure_id | INTEGER | ✅ PK | ID duy nhất |
person_id | INTEGER | ✅ FK | Bệnh nhân |
drug_concept_id | INTEGER | ✅ | Standard Concept (RxNorm) |
drug_exposure_start_date | DATE | ✅ | Ngày bắt đầu |
drug_exposure_start_datetime | DATETIME | Ngày giờ bắt đầu | |
drug_exposure_end_date | DATE | ✅ | Ngày kết thúc |
drug_exposure_end_datetime | DATETIME | Ngày giờ kết thúc | |
verbatim_end_date | DATE | End date gốc (trước suy luận) | |
drug_type_concept_id | INTEGER | ✅ | Nguồn dữ liệu |
stop_reason | VARCHAR(20) | Lý do ngừng thuốc | |
refills | INTEGER | Số lần refill | |
quantity | FLOAT | Số lượng cấp phát | |
days_supply | INTEGER | Số ngày cung cấp | |
sig | CLOB | Hướng dẫn sử dụng gốc | |
route_concept_id | INTEGER | Đường dùng (uống, tiêm...) | |
lot_number | VARCHAR(50) | Số lô (quan trọng cho vaccine) | |
provider_id | INTEGER | FK | Bác sĩ kê đơn |
visit_occurrence_id | INTEGER | FK | Visit liên quan |
visit_detail_id | INTEGER | FK | Visit detail |
drug_source_value | VARCHAR(50) | Mã thuốc gốc | |
drug_source_concept_id | INTEGER | Concept gốc | |
route_source_value | VARCHAR(50) | Đường dùng gốc | |
dose_unit_source_value | VARCHAR(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
| Level | Khi nào dùng | Ví dụ |
|---|---|---|
| Ingredient | Chỉ biết hoạt chất | "Metformin" |
| Clinical Drug | Biết hoạt chất + liều + dạng | "Metformin 500mg Tablet" |
| Branded Drug | Biết tên thương mại | "Glucophage 500mg Tab" |
| Clinical Drug Component | Hoạ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 ID | Tên | Use case |
|---|---|---|
| 32838 | EHR prescription | Đơn thuốc từ HIS |
| 32839 | EHR dispensing | Nhà thuốc cấp phát |
| 32818 | EHR administration | Y tá ghi nhận tiêm/truyền |
| 32869 | Patient self-reported | BN tự khai thuốc đang dùng |
| 32810 | Claim | Dữ 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 ID | Route | Tiếng Việt |
|---|---|---|
| 4132161 | Oral | Uống |
| 4171047 | Intravenous | Tiêm tĩnh mạch |
| 4302612 | Intramuscular | Tiêm bắp |
| 4142048 | Subcutaneous | Tiêm dưới da |
| 4186838 | Topical | Bôi ngoài da |
| 4290759 | Inhaled | Hít / khí dung |
| 4163768 | Rectal | Trực tràng |
| 4186747 | Ophthalmic | Nhỏ 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êng | Map qua SOURCE_TO_CONCEPT_MAP |
| Tên thuốc tiếng Việt | Usagi mapping tool |
| Thuốc combo (Metformin + Glipizide) | Map về RxNorm combo concept |
| Không biết liều/dạng | Map về Ingredient level |
| Thuốc đông y / thuốc nam | concept_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
- DRUG_EXPOSURE = kê đơn + cấp phát + tiêm truyền + vaccine
- drug_concept_id dùng RxNorm (Ingredient → Clinical Drug → Branded Drug)
- days_supply + quantity + refills tạo bức tranh đầy đủ
- route_concept_id cho đường dùng, lot_number cho vaccine
- drug_type_concept_id phân biệt prescription vs dispensing vs administration
- 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.