Ghi nhận chẩn đoán, triệu chứng, dấu hiệu bệnh lý, condition_concept_id vs source_value, condition_status (admitting/primary/secondary), liên kết với Visit và Provider, phân biệt với OBSERVATION table.
Giới thiệu
CONDITION_OCCURRENCE ghi nhận mọi chẩn đoán, triệu chứng, và dấu hiệu bệnh lý mà bác sĩ ghi nhận cho bệnh nhân. Đây thường là bảng được phân tích nhiều nhất trong OMOP CDM — vì nghiên cứu y tế thường bắt đầu từ câu hỏi: "Ai bị bệnh gì?"
-- SQL ETL
SELECT
ROW_NUMBER() OVER() AS condition_occurrence_id,
pm.person_id,
COALESCE(cr.concept_id_2, 0) AS condition_concept_id,
cd.ngay_chandoan AS condition_start_date,
NULL AS condition_end_date,
32817 AS condition_type_concept_id,
CASE cd.loai_chandoan
WHEN 'CHINH' THEN 32902 -- Primary
WHEN 'PHU' THEN 32908 -- Secondary
ELSE 0
END AS condition_status_concept_id,
cd.ma_icd10 AS condition_source_value,
COALESCE(c_source.concept_id, 0) AS condition_source_concept_id
FROM chandoan_his cd
JOIN person_mapping pm ON cd.ma_bn = pm.source_id
LEFT JOIN concept c_source
ON cd.ma_icd10 = c_source.concept_code
AND c_source.vocabulary_id = 'ICD10CM'
LEFT JOIN concept_relationship cr
ON c_source.concept_id = cr.concept_id_1
AND cr.relationship_id = 'Maps to'
LEFT JOIN concept c_std
ON cr.concept_id_2 = c_std.concept_id
AND c_std.standard_concept = 'S';
4.2. Xử lý dữ liệu đặc thù VN
Vấn đề
Giải pháp
ICD-10-VN khác ICD-10-CM
Mapping qua SOURCE_TO_CONCEPT_MAP
Mã nội bộ BV
Usagi mapping tool
Thiếu ngày kết thúc
condition_end_date = NULL (hợp lệ)
1 ICD map nhiều SNOMED
Chọn concept phù hợp nhất
5. Phân biệt CONDITION vs OBSERVATION
Tiêu chí
CONDITION_OCCURRENCE
OBSERVATION
Nội dung
Bệnh hiện tại / đang điều trị
Tiền sử, lối sống, ghi nhận
Ví dụ
"Tiểu đường type 2"
"Tiền sử tiểu đường gia đình"
Domain
Condition
Observation
Standard Vocab
SNOMED CT
SNOMED CT
Khi nào?
Bệnh đang hoạt động
Ghi nhận thông tin
Quy tắc: Luôn kiểm tra domain_id của Standard Concept trên Athena. Nếu domain = "Observation", lưu vào OBSERVATION dù nguồn là ICD-10.
6. SQL phân tích phổ biến
-- Top 10 chẩn đoán phổ biến nhất
SELECT
c.concept_name AS condition_name,
COUNT(DISTINCT co.person_id) AS patient_count,
COUNT(*) AS record_count
FROM condition_occurrence co
JOIN concept c ON co.condition_concept_id = c.concept_id
WHERE co.condition_concept_id != 0
GROUP BY c.concept_name
ORDER BY patient_count DESC
LIMIT 10;
-- Tỉ lệ mắc bệnh theo giới tính
SELECT
g.concept_name AS gender,
c.concept_name AS condition_name,
COUNT(DISTINCT co.person_id) AS patients
FROM condition_occurrence co
JOIN person p ON co.person_id = p.person_id
JOIN concept g ON p.gender_concept_id = g.concept_id
JOIN concept c ON co.condition_concept_id = c.concept_id
WHERE co.condition_concept_id = 201826 -- Type 2 DM
GROUP BY g.concept_name, c.concept_name;
-- Comorbidity: BN tiểu đường có tăng huyết áp?
SELECT
COUNT(DISTINCT co_dm.person_id) AS dm_patients,
COUNT(DISTINCT co_ht.person_id) AS dm_with_hypertension,
ROUND(
COUNT(DISTINCT co_ht.person_id) * 100.0 /
NULLIF(COUNT(DISTINCT co_dm.person_id), 0), 1
) AS comorbidity_pct
FROM condition_occurrence co_dm
LEFT JOIN condition_occurrence co_ht
ON co_dm.person_id = co_ht.person_id
AND co_ht.condition_concept_id IN (
SELECT descendant_concept_id
FROM concept_ancestor
WHERE ancestor_concept_id = 320128 -- Essential hypertension
)
WHERE co_dm.condition_concept_id IN (
SELECT descendant_concept_id
FROM concept_ancestor
WHERE ancestor_concept_id = 201826 -- Type 2 DM
);
Tổng kết
CONDITION_OCCURRENCE = chẩn đoán, triệu chứng, dấu hiệu bệnh lý
condition_concept_id dùng Standard Concept (SNOMED CT)