Bài 9: PROCEDURE_OCCURRENCE — Thủ thuật & Phẫu thuật
Ghi nhận thủ thuật, phẫu thuật, can thiệp y khoa. SNOMED / CPT4 / ICD-10-PCS mapping, modifier_concept_id, phân biệt Procedure vs Measurement vs Drug, thực hành ETL dữ liệu bệnh viện Việt Nam.
Giới thiệu
PROCEDURE_OCCURRENCE ghi nhận mọi thủ thuật, phẫu thuật, và can thiệp y khoa được thực hiện trên bệnh nhân. Từ đo huyết áp đơn giản đến phẫu thuật tim mở phức tạp — tất cả đều được chuẩn hóa trong bảng này. Bài học sẽ giúp bạn hiểu khi nào dùng PROCEDURE, khi nào dùng MEASUREMENT hay DRUG.
1. Cấu trúc bảng
Cột
Kiểu
Bắt buộc
Mô tả
procedure_occurrence_id
INTEGER
✅ PK
ID duy nhất
person_id
INTEGER
✅ FK
Bệnh nhân
procedure_concept_id
INTEGER
✅
Standard Concept
procedure_date
DATE
✅
Ngày thực hiện
procedure_datetime
DATETIME
Ngày giờ
procedure_end_date
DATE
Ngày kết thúc (CDM 5.4 mới)
procedure_end_datetime
DATETIME
Giờ kết thúc
procedure_type_concept_id
INTEGER
✅
Nguồn dữ liệu
modifier_concept_id
INTEGER
Bổ sung (trái/phải, lần 2...)
quantity
INTEGER
Số lần thực hiện
provider_id
INTEGER
FK
Bác sĩ thực hiện
visit_occurrence_id
INTEGER
FK
Visit liên quan
visit_detail_id
INTEGER
FK
Visit detail
procedure_source_value
VARCHAR(50)
Mã gốc
procedure_source_concept_id
INTEGER
Concept gốc
modifier_source_value
VARCHAR(50)
Modifier gốc
Mới trong CDM 5.4:procedure_end_date và procedure_end_datetime — quan trọng cho phẫu thuật kéo dài nhiều giờ/ngày.
Quy tắc vàng: Luôn check domain_id của Standard Concept. Dù mã nguồn là CPT4 (procedure code), nếu Standard Concept có domain = Measurement, phải lưu vào MEASUREMENT.
3. Procedure vs Measurement vs Drug — Ranh giới
Dữ liệu gốc
Ở đâu?
Lý do
Phẫu thuật ruột thừa
PROCEDURE
Domain = Procedure
Siêu âm bụng
PROCEDURE
Domain = Procedure (imaging)
Xét nghiệm máu (kết quả 5.8 mmol/L)
MEASUREMENT
Có giá trị đo → Measurement
Chụp X-quang tim phổi (không kết quả)
PROCEDURE
Imaging → Procedure
Tiêm insulin
DRUG_EXPOSURE
Drug administration
Nội soi đại tràng + sinh thiết
PROCEDURE
Can thiệp thủ thuật
Vật lý trị liệu 30 phút
PROCEDURE
Procedure domain
Truyền máu
PROCEDURE
Transfusion = Procedure
4. modifier_concept_id — Bổ sung thông tin
Concept ID
Modifier
Ý nghĩa
4148525
Left
Bên trái
4149625
Right
Bên phải
4236436
Bilateral
Cả hai bên
4215561
Initial encounter
Lần đầu
4215562
Subsequent encounter
Tái khám
-- Phẫu thuật cắt ruột thừa nội soi (bên phải)
INSERT INTO procedure_occurrence (
procedure_occurrence_id, person_id, procedure_concept_id,
procedure_date, procedure_end_date,
procedure_type_concept_id,
modifier_concept_id, quantity,
provider_id, visit_occurrence_id,
procedure_source_value
) VALUES (
90001, 100001, 44783086, -- SNOMED: Lapar appendectomy
'2024-06-15', '2024-06-15',
32817, -- EHR
4149625, 1, -- Right side, 1 time
5001, 50001,
'0DTJ4ZZ' -- ICD-10-PCS
);
5. ETL dữ liệu VN
5.1. Nguồn dữ liệu phổ biến
Nguồn
Mô tả
Vocabulary gốc
Danh mục DVKT BV
Dịch vụ kỹ thuật BV
Mã nội bộ
ICD-9-CM Proc
Mã phẫu thuật cũ
ICD9Proc
Danh mục BHXH
Mã dịch vụ BHXH
Mã BH nội bộ
5.2. SQL ETL
SELECT
ROW_NUMBER() OVER() AS procedure_occurrence_id,
pm.person_id,
COALESCE(cr.concept_id_2, 0) AS procedure_concept_id,
tt.ngay_thuchien AS procedure_date,
tt.ngay_ketthuc AS procedure_end_date,
32817 AS procedure_type_concept_id,
0 AS modifier_concept_id,
tt.so_lan AS quantity,
tt.ma_dvkt AS procedure_source_value,
COALESCE(c_source.concept_id, 0) AS procedure_source_concept_id
FROM thuthuat_his tt
JOIN person_mapping pm ON tt.ma_bn = pm.source_id
LEFT JOIN source_to_concept_map stcm
ON tt.ma_dvkt = stcm.source_code
AND stcm.source_vocabulary_id = 'VN_PROCEDURE'
LEFT JOIN concept c_std
ON stcm.target_concept_id = c_std.concept_id
AND c_std.standard_concept = 'S'
AND c_std.domain_id = 'Procedure' -- ← Chỉ Procedure domain!
LEFT JOIN concept c_source
ON tt.ma_dvkt = c_source.concept_code
LEFT JOIN concept_relationship cr
ON c_source.concept_id = cr.concept_id_1
AND cr.relationship_id = 'Maps to';
5.3. Xử lý domain routing
-- DVKT "Xét nghiệm HbA1c" → mã CPT 83036
-- Standard concept domain = Measurement → KHÔNG lưu vào PROCEDURE
-- Bước 1: Tìm Standard Concept
SELECT c.*
FROM concept c
JOIN concept_relationship cr ON c.concept_id = cr.concept_id_2
AND cr.relationship_id = 'Maps to'
JOIN concept c_src ON cr.concept_id_1 = c_src.concept_id
WHERE c_src.concept_code = '83036'
AND c_src.vocabulary_id = 'CPT4';
-- domain_id = 'Measurement' → route sang MEASUREMENT table
-- Bước 2: Lưu vào đúng bảng
-- Nếu domain = 'Procedure' → procedure_occurrence
-- Nếu domain = 'Measurement' → measurement
-- Nếu domain = 'Observation' → observation
-- Nếu domain = 'Drug' → drug_exposure
6. SQL phân tích
-- Top 10 thủ thuật phổ biến
SELECT
c.concept_name AS procedure_name,
COUNT(*) AS procedure_count,
COUNT(DISTINCT po.person_id) AS patient_count
FROM procedure_occurrence po
JOIN concept c ON po.procedure_concept_id = c.concept_id
WHERE po.procedure_concept_id != 0
GROUP BY c.concept_name
ORDER BY procedure_count DESC
LIMIT 10;
-- Thống kê phẫu thuật theo tháng
SELECT
DATE_TRUNC('month', po.procedure_date) AS month,
c.concept_name AS procedure_name,
COUNT(*) AS total
FROM procedure_occurrence po
JOIN concept c ON po.procedure_concept_id = c.concept_id
WHERE po.procedure_concept_id = 44783086 -- Appendectomy
GROUP BY month, c.concept_name
ORDER BY month;
-- BN có cả chẩn đoán + phẫu thuật liên quan
SELECT
po.person_id,
co_cond.concept_name AS diagnosis,
co_proc.concept_name AS procedure_name,
co.condition_start_date,
po.procedure_date
FROM procedure_occurrence po
JOIN condition_occurrence co ON po.person_id = co.person_id
AND po.visit_occurrence_id = co.visit_occurrence_id
JOIN concept co_cond ON co.condition_concept_id = co_cond.concept_id
JOIN concept co_proc ON po.procedure_concept_id = co_proc.concept_id
WHERE co.condition_concept_id = 441604 -- Appendicitis
AND po.procedure_concept_id = 44783086 -- Appendectomy
LIMIT 20;
Tổng kết
PROCEDURE_OCCURRENCE = thủ thuật, phẫu thuật, can thiệp, imaging
Standard Vocabulary chính: SNOMED CT
Domain routing cực quan trọng: CPT4 code có thể map sang Measurement, không phải Procedure
CDM 5.4 bổ sung procedure_end_date cho phẫu thuật kéo dài
modifier_concept_id cho trái/phải, lần đầu/tái khám
ETL VN: mã DVKT nội bộ → SOURCE_TO_CONCEPT_MAP → Standard SNOMED
Bài tiếp theo: MEASUREMENT — xét nghiệm, đo lường, và giá trị số.