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

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.

🏗️ Kiến trúc — Bài 9 PROCEDURE_OCCURRENCE Thủ thuật & Phẫu thuật 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

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ộtKiểuBắt buộcMô tả
procedure_occurrence_idINTEGER✅ PKID duy nhất
person_idINTEGER✅ FKBệnh nhân
procedure_concept_idINTEGER✅Standard Concept
procedure_dateDATE✅Ngày thực hiện
procedure_datetimeDATETIMENgày giờ
procedure_end_dateDATENgày kết thúc (CDM 5.4 mới)
procedure_end_datetimeDATETIMEGiờ kết thúc
procedure_type_concept_idINTEGER✅Nguồn dữ liệu
modifier_concept_idINTEGERBổ sung (trái/phải, lần 2...)
quantityINTEGERSố lần thực hiện
provider_idINTEGERFKBác sĩ thực hiện
visit_occurrence_idINTEGERFKVisit liên quan
visit_detail_idINTEGERFKVisit detail
procedure_source_valueVARCHAR(50)Mã gốc
procedure_source_concept_idINTEGERConcept gốc
modifier_source_valueVARCHAR(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.


2. Vocabulary cho Procedure

2.1. Các vocabulary phổ biến

VocabularyVai tròVí dụ
SNOMED CTStandard conceptAppendectomy (44783086)
CPT4US billing code44970 (Laparoscopic appendectomy)
ICD-10-PCSUS inpatient procedures0DTJ4ZZ
ICD-9-ProcLegacy US procedures47.01
HCPCSUS outpatient servicesG0101

2.2. Domain routing quy tắc

  ICD-10-PCS mã = '0DTJ4ZZ' (Lapar appendectomy)
       │
       │ concept_relationship: Maps to
       ↓
  SNOMED concept_id = 44783086
  concept_name = 'Laparoscopic appendectomy'
  domain_id = 'Procedure'
       │
       └──→ Lưu vào PROCEDURE_OCCURRENCE ✓


  CPT4 mã = '80053' (Basic metabolic panel)
       │
       │ concept_relationship: Maps to
       ↓
  SNOMED concept_id = 3019897
  domain_id = 'Measurement'
       │
       └──→ Lưu vào MEASUREMENT ✗ (không phải Procedure!)

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ừaPROCEDUREDomain = Procedure
Siêu âm bụngPROCEDUREDomain = Procedure (imaging)
Xét nghiệm máu (kết quả 5.8 mmol/L)MEASUREMENTCó giá trị đo → Measurement
Chụp X-quang tim phổi (không kết quả)PROCEDUREImaging → Procedure
Tiêm insulinDRUG_EXPOSUREDrug administration
Nội soi đại tràng + sinh thiếtPROCEDURECan thiệp thủ thuật
Vật lý trị liệu 30 phútPROCEDUREProcedure domain
Truyền máuPROCEDURETransfusion = Procedure

4. modifier_concept_id — Bổ sung thông tin

Concept IDModifierÝ nghĩa
4148525LeftBên trái
4149625RightBên phải
4236436BilateralCả hai bên
4215561Initial encounterLần đầu
4215562Subsequent encounterTá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ồnMô tảVocabulary gốc
Danh mục DVKT BVDịch vụ kỹ thuật BVMã nội bộ
ICD-9-CM ProcMã phẫu thuật cũICD9Proc
Danh mục BHXHMã dịch vụ BHXHMã 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

  1. PROCEDURE_OCCURRENCE = thủ thuật, phẫu thuật, can thiệp, imaging
  2. Standard Vocabulary chính: SNOMED CT
  3. Domain routing cực quan trọng: CPT4 code có thể map sang Measurement, không phải Procedure
  4. CDM 5.4 bổ sung procedure_end_date cho phẫu thuật kéo dài
  5. modifier_concept_id cho trái/phải, lần đầu/tái khám
  6. 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ố.


Tài liệu tham khảo