@xdev-asia/xdev-knowledge-mcp 1.0.55 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/01-phan-1-tong-quan-nen-tang/lessons/bai-1-omop-cdm-la-gi-tai-sao-can-chuan-hoa-du-lieu-y-te.md +339 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/01-phan-1-tong-quan-nen-tang/lessons/bai-2-kien-truc-tong-the-omop-cdm-5-4-nhom-bang-nguyen-ly-thiet-ke.md +440 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/01-phan-1-tong-quan-nen-tang/lessons/bai-3-hieu-concept-trai-tim-cua-omop-cdm.md +441 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/02-phan-2-person-visit-nen-tang/lessons/bai-4-bang-person-quan-ly-danh-tinh-benh-nhan.md +323 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/02-phan-2-person-visit-nen-tang/lessons/bai-5-observation-period-khoang-thoi-gian-theo-doi-benh-nhan.md +308 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/02-phan-2-person-visit-nen-tang/lessons/bai-6-visit-occurrence-visit-detail-luot-kham-chi-tiet.md +353 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-10-measurement-xet-nghiem-do-luong.md +409 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-7-condition-occurrence-chan-doan-benh-ly.md +285 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-8-drug-exposure-thuoc-dieu-tri.md +354 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/03-phan-3-su-kien-lam-sang-chinh/lessons/bai-9-procedure-occurrence-thu-thuat-phau-thuat.md +291 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/04-phan-4-bang-lam-sang-mo-rong/lessons/bai-11-observation-su-kien-lam-sang-tong-hop.md +289 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/04-phan-4-bang-lam-sang-mo-rong/lessons/bai-12-device-exposure-specimen-note.md +313 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/04-phan-4-bang-lam-sang-mo-rong/lessons/bai-13-death-episode-episode-event.md +346 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/05-phan-5-standardized-vocabularies/lessons/bai-14-concept-vocabulary-nen-tang-tu-dien-chuan.md +298 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/05-phan-5-standardized-vocabularies/lessons/bai-15-concept-relationship-concept-ancestor.md +336 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/05-phan-5-standardized-vocabularies/lessons/bai-16-drug-strength-cac-bang-vocabulary-con-lai.md +295 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/06-phan-6-health-system-economics-derived/lessons/bai-17-location-care-site-provider.md +334 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/06-phan-6-health-system-economics-derived/lessons/bai-18-payer-plan-period-cost.md +343 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/06-phan-6-health-system-economics-derived/lessons/bai-19-condition-era-drug-era-dose-era.md +418 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/chapters/07-phan-7-metadata-cohort-tong-ket/lessons/bai-20-cdm-source-metadata-cohort-tong-ket.md +517 -0
- package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/index.md +385 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/01-bai-1-gioi-thieu-vyos-va-cai-dat.md +10 -1
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/02-bai-2-cau-hinh-interface-va-ip-co-ban.md +4 -3
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/03-bai-3-nat-source-nat-destination-nat-va-masquerade.md +1 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/04-bai-4-firewall-co-ban-rules-chains-va-groups.md +2 -2
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/05-bai-5-zone-based-firewall.md +2 -2
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/06-bai-6-dhcp-server-dns-forwarding-va-ntp.md +4 -1
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/07-bai-7-vlans-bonding-va-bridge.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/08-bai-8-static-routing-va-policy-based-routing.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/09-bai-9-dynamic-routing-ospf.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/10-bai-10-dynamic-routing-bgp.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/11-bai-11-vpn-wireguard-va-openvpn.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/12-bai-12-vpn-ipsec-site-to-site.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/13-bai-13-high-availability-vrrp-va-conntrack-sync.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/14-bai-14-wan-load-balancing-qos-va-monitoring.md +2 -0
- package/content/series/devsecops/vyos-tu-co-ban-den-nang-cao/chapters/01-vyos-tu-co-ban-den-nang-cao/lessons/15-bai-15-containers-automation-va-production-best-practices.md +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: 019f1a00-a106-7b01-e001-omopcdm54006
|
|
3
|
+
title: "Bài 6: VISIT_OCCURRENCE & VISIT_DETAIL — Lượt khám & Chi tiết"
|
|
4
|
+
slug: bai-6-visit-occurrence-visit-detail-luot-kham-chi-tiet
|
|
5
|
+
description: >-
|
|
6
|
+
Các loại Visit (Inpatient, Outpatient, ER, Telehealth),
|
|
7
|
+
cấu trúc VISIT_OCCURRENCE, VISIT_DETAIL cho chi tiết trong
|
|
8
|
+
một lượt khám, admitted_from/discharged_to, và mối quan hệ
|
|
9
|
+
Visit-Event trong mô hình OMOP.
|
|
10
|
+
duration_minutes: 60
|
|
11
|
+
is_free: true
|
|
12
|
+
video_url: null
|
|
13
|
+
sort_order: 6
|
|
14
|
+
section_title: "Phần 2: Person & Visit — Nền tảng dữ liệu"
|
|
15
|
+
course:
|
|
16
|
+
id: 019f1a00-a100-7b01-e001-omopcdm54001
|
|
17
|
+
title: "OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z"
|
|
18
|
+
slug: omop-cdm-5-4-cho-nguoi-moi-bat-dau
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 340" style="max-width: 100%; height: auto; border-radius: 12px; margin-bottom: 1.5rem;">
|
|
22
|
+
<defs>
|
|
23
|
+
<linearGradient id="bg-omop06" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
24
|
+
<stop offset="0%" style="stop-color:#0c1222"/>
|
|
25
|
+
<stop offset="100%" style="stop-color:#1e293b"/>
|
|
26
|
+
</linearGradient>
|
|
27
|
+
</defs>
|
|
28
|
+
<rect width="1200" height="340" rx="12" fill="url(#bg-omop06)"/>
|
|
29
|
+
<g>
|
|
30
|
+
<circle cx="659" cy="87" r="22" fill="#818cf8" opacity="0.12"/>
|
|
31
|
+
<circle cx="718" cy="106" r="29" fill="#818cf8" opacity="0.09"/>
|
|
32
|
+
<circle cx="777" cy="125" r="36" fill="#818cf8" opacity="0.06"/>
|
|
33
|
+
<circle cx="836" cy="144" r="13" fill="#818cf8" opacity="0.13"/>
|
|
34
|
+
<circle cx="895" cy="163" r="20" fill="#818cf8" opacity="0.1"/>
|
|
35
|
+
<line x1="600" y1="157" x2="1100" y2="237" stroke="#818cf8" stroke-width="0.5" opacity="0.1"/>
|
|
36
|
+
</g>
|
|
37
|
+
<rect x="60" y="50" width="4" height="60" rx="2" fill="#818cf8"/>
|
|
38
|
+
<rect x="80" y="50" width="121" height="28" rx="14" fill="#818cf8" opacity="0.15"/>
|
|
39
|
+
<text x="92" y="69" font-family="system-ui,-apple-system,sans-serif" font-size="13" font-weight="600" fill="#818cf8">🏗️ Kiến trúc — Bài 6</text>
|
|
40
|
+
<text x="60" y="140" font-family="system-ui,-apple-system,sans-serif" font-size="34" font-weight="700" fill="#f1f5f9">
|
|
41
|
+
<tspan x="60" dy="0">VISIT_OCCURRENCE & VISIT_DETAIL</tspan>
|
|
42
|
+
<tspan x="60" dy="42">Lượt khám & Chi tiết</tspan>
|
|
43
|
+
</text>
|
|
44
|
+
<text x="60" y="244" font-family="system-ui,-apple-system,sans-serif" font-size="15" fill="#94a3b8" opacity="0.8">OMOP CDM 5.4 cho Người mới — Hiểu từ A đến Z</text>
|
|
45
|
+
<text x="60" y="268" font-family="system-ui,-apple-system,sans-serif" font-size="13" fill="#64748b" opacity="0.6">Phần 2: Person & Visit — Nền tảng dữ liệu</text>
|
|
46
|
+
<text x="1140" y="320" font-family="system-ui,-apple-system,sans-serif" font-size="12" fill="#475569" text-anchor="end" opacity="0.4">xdev.asia</text>
|
|
47
|
+
</svg>
|
|
48
|
+
|
|
49
|
+
## Giới thiệu
|
|
50
|
+
|
|
51
|
+
**VISIT_OCCURRENCE** ghi nhận mỗi lần bệnh nhân tiếp xúc với hệ thống y tế — từ khám ngoại trú, nhập viện, cấp cứu, đến khám từ xa (telehealth). **VISIT_DETAIL** bổ sung chi tiết hơn: trong 1 lần nhập viện, BN có thể chuyển qua nhiều khoa.
|
|
52
|
+
|
|
53
|
+
Hai bảng này là **cầu nối** giữa PERSON và tất cả sự kiện lâm sàng.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 1. VISIT_OCCURRENCE — Cấu trúc
|
|
58
|
+
|
|
59
|
+
### 1.1. Danh sách cột
|
|
60
|
+
|
|
61
|
+
| Cột | Kiểu | Bắt buộc | Mô tả |
|
|
62
|
+
|-----|------|----------|-------|
|
|
63
|
+
| `visit_occurrence_id` | INTEGER | ✅ PK | ID duy nhất cho mỗi visit |
|
|
64
|
+
| `person_id` | INTEGER | ✅ FK | Tham chiếu PERSON |
|
|
65
|
+
| `visit_concept_id` | INTEGER | ✅ | Loại visit (Standard Concept) |
|
|
66
|
+
| `visit_start_date` | DATE | ✅ | Ngày bắt đầu |
|
|
67
|
+
| `visit_start_datetime` | DATETIME | | Ngày giờ bắt đầu |
|
|
68
|
+
| `visit_end_date` | DATE | ✅ | Ngày kết thúc |
|
|
69
|
+
| `visit_end_datetime` | DATETIME | | Ngày giờ kết thúc |
|
|
70
|
+
| `visit_type_concept_id` | INTEGER | ✅ | Nguồn dữ liệu (EHR, Claim...) |
|
|
71
|
+
| `provider_id` | INTEGER | FK | Bác sĩ phụ trách |
|
|
72
|
+
| `care_site_id` | INTEGER | FK | Cơ sở y tế |
|
|
73
|
+
| `visit_source_value` | VARCHAR(50) | | Mã visit gốc |
|
|
74
|
+
| `visit_source_concept_id` | INTEGER | | Concept gốc |
|
|
75
|
+
| `admitted_from_concept_id` | INTEGER | | Đến từ đâu (Home, ER...) |
|
|
76
|
+
| `admitted_from_source_value` | VARCHAR(50) | | Giá trị gốc |
|
|
77
|
+
| `discharged_to_concept_id` | INTEGER | | Ra viện về đâu |
|
|
78
|
+
| `discharged_to_source_value` | VARCHAR(50) | | Giá trị gốc |
|
|
79
|
+
| `preceding_visit_occurrence_id` | INTEGER | FK | Visit trước đó |
|
|
80
|
+
|
|
81
|
+
### 1.2. Các loại Visit quan trọng
|
|
82
|
+
|
|
83
|
+
| visit_concept_id | Concept Name | Mô tả VN |
|
|
84
|
+
|------------------|-------------|-----------|
|
|
85
|
+
| 9201 | **Inpatient Visit** | Nhập viện nội trú |
|
|
86
|
+
| 9202 | **Outpatient Visit** | Khám ngoại trú |
|
|
87
|
+
| 9203 | **Emergency Room Visit** | Cấp cứu |
|
|
88
|
+
| 262 | **Emergency Room and Inpatient Visit** | Cấp cứu → Nhập viện |
|
|
89
|
+
| 581477 | **Telehealth** | Khám từ xa |
|
|
90
|
+
| 32693 | **Pharmacy visit** | Lấy thuốc tại nhà thuốc |
|
|
91
|
+
| 581476 | **Home Visit** | Khám tại nhà |
|
|
92
|
+
| 38004515 | **Laboratory Visit** | Chỉ đến xét nghiệm |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 2. Ví dụ: Bệnh nhân nhập viện
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
Bệnh nhân 100001: Nhập viện 10 ngày tại BV Chợ Rẫy
|
|
100
|
+
|
|
101
|
+
┌──────────────── VISIT_OCCURRENCE ────────────────┐
|
|
102
|
+
│ visit_occurrence_id = 50001 │
|
|
103
|
+
│ person_id = 100001 │
|
|
104
|
+
│ visit_concept_id = 9201 (Inpatient Visit) │
|
|
105
|
+
│ visit_start_date = 2024-06-10 │
|
|
106
|
+
│ visit_end_date = 2024-06-20 │
|
|
107
|
+
│ admitted_from_concept_id = 581476 (Home) │
|
|
108
|
+
│ discharged_to_concept_id = 581476 (Home) │
|
|
109
|
+
│ care_site_id = 2001 (BV Chợ Rẫy) │
|
|
110
|
+
└───────────────────────────────────────────────────┘
|
|
111
|
+
│
|
|
112
|
+
│ Trong visit này có các events:
|
|
113
|
+
│
|
|
114
|
+
├── CONDITION: Tiểu đường type 2 (chẩn đoán chính)
|
|
115
|
+
├── CONDITION: Tăng huyết áp (chẩn đoán phụ)
|
|
116
|
+
├── DRUG: Metformin 500mg x 20 viên
|
|
117
|
+
├── DRUG: Amlodipine 5mg x 10 viên
|
|
118
|
+
├── MEASUREMENT: HbA1c = 8.2%
|
|
119
|
+
├── MEASUREMENT: Creatinine = 1.2 mg/dL
|
|
120
|
+
├── PROCEDURE: Siêu âm bụng
|
|
121
|
+
└── OBSERVATION: Tiền sử hút thuốc
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```sql
|
|
125
|
+
INSERT INTO visit_occurrence VALUES (
|
|
126
|
+
50001, -- visit_occurrence_id
|
|
127
|
+
100001, -- person_id
|
|
128
|
+
9201, -- visit_concept_id (Inpatient)
|
|
129
|
+
'2024-06-10', -- visit_start_date
|
|
130
|
+
'2024-06-10 08:30:00', -- visit_start_datetime
|
|
131
|
+
'2024-06-20', -- visit_end_date
|
|
132
|
+
'2024-06-20 14:00:00', -- visit_end_datetime
|
|
133
|
+
32817, -- visit_type_concept_id (EHR)
|
|
134
|
+
5001, -- provider_id
|
|
135
|
+
2001, -- care_site_id
|
|
136
|
+
'MNV-2024-50001', -- visit_source_value
|
|
137
|
+
0, -- visit_source_concept_id
|
|
138
|
+
581476, -- admitted_from_concept_id (Home)
|
|
139
|
+
'Nhà', -- admitted_from_source_value
|
|
140
|
+
581476, -- discharged_to_concept_id (Home)
|
|
141
|
+
'Nhà', -- discharged_to_source_value
|
|
142
|
+
NULL -- preceding_visit_occurrence_id
|
|
143
|
+
);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 3. VISIT_DETAIL — Chi tiết trong Visit
|
|
149
|
+
|
|
150
|
+
### 3.1. Khi nào cần VISIT_DETAIL?
|
|
151
|
+
|
|
152
|
+
VISIT_DETAIL ghi nhận **chi tiết phụ** trong một VISIT_OCCURRENCE. Đặc biệt hữu ích cho **nhập viện nội trú** khi BN chuyển qua nhiều khoa:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
VISIT_OCCURRENCE (Inpatient, 10 ngày):
|
|
156
|
+
═══════════════════════════════════════════════════
|
|
157
|
+
|
|
158
|
+
VISIT_DETAIL (chi tiết):
|
|
159
|
+
├── Cấp cứu (10/06, 2 giờ)
|
|
160
|
+
│ ═══
|
|
161
|
+
├── Khoa Nội tiết (10/06 → 15/06, 5 ngày)
|
|
162
|
+
│ ═══════════════════
|
|
163
|
+
├── ICU (15/06 → 17/06, 2 ngày)
|
|
164
|
+
│ ═══════
|
|
165
|
+
└── Khoa Nội tiết (17/06 → 20/06, 3 ngày)
|
|
166
|
+
═══════════
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 3.2. Cấu trúc VISIT_DETAIL
|
|
170
|
+
|
|
171
|
+
| Cột | Kiểu | Mô tả |
|
|
172
|
+
|-----|------|-------|
|
|
173
|
+
| `visit_detail_id` | INTEGER | PK |
|
|
174
|
+
| `person_id` | INTEGER | FK → PERSON |
|
|
175
|
+
| `visit_detail_concept_id` | INTEGER | Loại detail (Department, Ward...) |
|
|
176
|
+
| `visit_detail_start_date` | DATE | Ngày bắt đầu tại khoa |
|
|
177
|
+
| `visit_detail_end_date` | DATE | Ngày rời khoa |
|
|
178
|
+
| `visit_detail_type_concept_id` | INTEGER | Nguồn dữ liệu |
|
|
179
|
+
| `provider_id` | INTEGER | Bác sĩ phụ trách tại khoa |
|
|
180
|
+
| `care_site_id` | INTEGER | Khoa/phòng cụ thể |
|
|
181
|
+
| `visit_occurrence_id` | INTEGER | **FK → VISIT_OCCURRENCE** (parent) |
|
|
182
|
+
| `visit_detail_parent_id` | INTEGER | FK → VISIT_DETAIL (parent detail) |
|
|
183
|
+
| `admitted_from_concept_id` | INTEGER | Chuyển từ đâu |
|
|
184
|
+
| `discharged_to_concept_id` | INTEGER | Chuyển đến đâu |
|
|
185
|
+
| `visit_detail_source_value` | VARCHAR(50) | Giá trị gốc |
|
|
186
|
+
|
|
187
|
+
### 3.3. Ví dụ
|
|
188
|
+
|
|
189
|
+
```sql
|
|
190
|
+
-- Visit Detail cho chuyển khoa
|
|
191
|
+
INSERT INTO visit_detail VALUES
|
|
192
|
+
-- Cấp cứu (2 giờ)
|
|
193
|
+
(1, 100001, 9203, '2024-06-10', '2024-06-10', 32817,
|
|
194
|
+
5002, 2010, 50001, NULL, 581476, NULL, 'ED'),
|
|
195
|
+
-- Khoa Nội tiết (5 ngày)
|
|
196
|
+
(2, 100001, 9201, '2024-06-10', '2024-06-15', 32817,
|
|
197
|
+
5003, 2020, 50001, 1, NULL, NULL, 'NOI_TIET'),
|
|
198
|
+
-- ICU (2 ngày)
|
|
199
|
+
(3, 100001, 32037, '2024-06-15', '2024-06-17', 32817,
|
|
200
|
+
5004, 2030, 50001, 2, NULL, NULL, 'ICU'),
|
|
201
|
+
-- Quay lại Nội tiết (3 ngày)
|
|
202
|
+
(4, 100001, 9201, '2024-06-17', '2024-06-20', 32817,
|
|
203
|
+
5003, 2020, 50001, 3, NULL, 581476, 'NOI_TIET');
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 4. Mối quan hệ Visit ↔ Clinical Events
|
|
209
|
+
|
|
210
|
+
Mọi bảng clinical event đều có cột `visit_occurrence_id`:
|
|
211
|
+
|
|
212
|
+
```sql
|
|
213
|
+
-- Tìm tất cả events trong 1 visit
|
|
214
|
+
SELECT 'Conditions' AS type, COUNT(*) AS count
|
|
215
|
+
FROM condition_occurrence WHERE visit_occurrence_id = 50001
|
|
216
|
+
UNION ALL
|
|
217
|
+
SELECT 'Drugs', COUNT(*)
|
|
218
|
+
FROM drug_exposure WHERE visit_occurrence_id = 50001
|
|
219
|
+
UNION ALL
|
|
220
|
+
SELECT 'Measurements', COUNT(*)
|
|
221
|
+
FROM measurement WHERE visit_occurrence_id = 50001
|
|
222
|
+
UNION ALL
|
|
223
|
+
SELECT 'Procedures', COUNT(*)
|
|
224
|
+
FROM procedure_occurrence WHERE visit_occurrence_id = 50001;
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
CDM 5.4 cũng thêm `visit_detail_id` vào nhiều bảng clinical — cho biết event xảy ra ở **khoa nào** trong visit:
|
|
228
|
+
|
|
229
|
+
```sql
|
|
230
|
+
-- Xét nghiệm nào thực hiện tại ICU?
|
|
231
|
+
SELECT m.*
|
|
232
|
+
FROM measurement m
|
|
233
|
+
JOIN visit_detail vd ON m.visit_detail_id = vd.visit_detail_id
|
|
234
|
+
WHERE vd.care_site_id = 2030; -- ICU
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 5. preceding_visit_occurrence_id — Chuỗi visits
|
|
240
|
+
|
|
241
|
+
Cột `preceding_visit_occurrence_id` tạo **linked list** giữa các visits:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
Visit 1 (2024-01-15, Outpatient)
|
|
245
|
+
│
|
|
246
|
+
└──→ Visit 2 (2024-03-20, Outpatient)
|
|
247
|
+
│ preceding_visit_occurrence_id = Visit 1
|
|
248
|
+
└──→ Visit 3 (2024-06-10, Inpatient)
|
|
249
|
+
preceding_visit_occurrence_id = Visit 2
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
```sql
|
|
253
|
+
-- Timeline visits của 1 bệnh nhân
|
|
254
|
+
WITH RECURSIVE visit_chain AS (
|
|
255
|
+
SELECT visit_occurrence_id, visit_start_date,
|
|
256
|
+
visit_concept_id, preceding_visit_occurrence_id, 1 AS seq
|
|
257
|
+
FROM visit_occurrence
|
|
258
|
+
WHERE person_id = 100001 AND preceding_visit_occurrence_id IS NULL
|
|
259
|
+
UNION ALL
|
|
260
|
+
SELECT vo.visit_occurrence_id, vo.visit_start_date,
|
|
261
|
+
vo.visit_concept_id, vo.preceding_visit_occurrence_id, vc.seq + 1
|
|
262
|
+
FROM visit_occurrence vo
|
|
263
|
+
JOIN visit_chain vc ON vo.preceding_visit_occurrence_id = vc.visit_occurrence_id
|
|
264
|
+
)
|
|
265
|
+
SELECT * FROM visit_chain ORDER BY seq;
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 6. ETL Conventions cho Visit
|
|
271
|
+
|
|
272
|
+
### 6.1. Quy tắc chung
|
|
273
|
+
|
|
274
|
+
| Quy tắc | Chi tiết |
|
|
275
|
+
|---------|----------|
|
|
276
|
+
| 1 encounter = 1 visit | Mỗi lần tiếp xúc = 1 VISIT_OCCURRENCE |
|
|
277
|
+
| Outpatient cùng ngày | Có thể gộp thành 1 visit nếu cùng ngày + cùng cơ sở |
|
|
278
|
+
| ER → Inpatient | Dùng concept 262 (ER and Inpatient Visit) |
|
|
279
|
+
| visit_end_date | Nếu outpatient: end_date = start_date |
|
|
280
|
+
| Nếu không có visit | Tạo "dummy visit" concept_id = 0 |
|
|
281
|
+
|
|
282
|
+
### 6.2. Ví dụ ETL cho BV Việt Nam
|
|
283
|
+
|
|
284
|
+
```sql
|
|
285
|
+
-- Mapping HIS VN → OMOP VISIT_OCCURRENCE
|
|
286
|
+
SELECT
|
|
287
|
+
ROW_NUMBER() OVER() AS visit_occurrence_id,
|
|
288
|
+
bn.person_id,
|
|
289
|
+
CASE
|
|
290
|
+
WHEN kc.loai_kham = 'NOI_TRU' THEN 9201 -- Inpatient
|
|
291
|
+
WHEN kc.loai_kham = 'NGOAI_TRU' THEN 9202 -- Outpatient
|
|
292
|
+
WHEN kc.loai_kham = 'CAP_CUU' THEN 9203 -- ER
|
|
293
|
+
WHEN kc.loai_kham = 'KHAM_TU_XA' THEN 581477 -- Telehealth
|
|
294
|
+
ELSE 0 -- Unknown
|
|
295
|
+
END AS visit_concept_id,
|
|
296
|
+
kc.ngay_vao AS visit_start_date,
|
|
297
|
+
COALESCE(kc.ngay_ra, kc.ngay_vao) AS visit_end_date,
|
|
298
|
+
32817 AS visit_type_concept_id, -- EHR
|
|
299
|
+
kc.ma_kham AS visit_source_value
|
|
300
|
+
FROM kcb_his kc
|
|
301
|
+
JOIN person_mapping bn ON kc.ma_bn = bn.source_id;
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 7. SQL phân tích thường dùng
|
|
307
|
+
|
|
308
|
+
```sql
|
|
309
|
+
-- Phân bố loại visit
|
|
310
|
+
SELECT
|
|
311
|
+
c.concept_name AS visit_type,
|
|
312
|
+
COUNT(*) AS count,
|
|
313
|
+
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct
|
|
314
|
+
FROM visit_occurrence vo
|
|
315
|
+
JOIN concept c ON vo.visit_concept_id = c.concept_id
|
|
316
|
+
GROUP BY c.concept_name
|
|
317
|
+
ORDER BY count DESC;
|
|
318
|
+
|
|
319
|
+
-- Thời gian nằm viện trung bình (Length of Stay)
|
|
320
|
+
SELECT
|
|
321
|
+
ROUND(AVG(visit_end_date - visit_start_date), 1) AS avg_los_days
|
|
322
|
+
FROM visit_occurrence
|
|
323
|
+
WHERE visit_concept_id = 9201; -- Inpatient only
|
|
324
|
+
|
|
325
|
+
-- Số visit trung bình mỗi bệnh nhân
|
|
326
|
+
SELECT
|
|
327
|
+
ROUND(AVG(visit_count), 1) AS avg_visits_per_patient
|
|
328
|
+
FROM (
|
|
329
|
+
SELECT person_id, COUNT(*) AS visit_count
|
|
330
|
+
FROM visit_occurrence
|
|
331
|
+
GROUP BY person_id
|
|
332
|
+
) sub;
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Tổng kết
|
|
338
|
+
|
|
339
|
+
1. **VISIT_OCCURRENCE** ghi nhận mỗi lần BN tiếp xúc hệ thống y tế
|
|
340
|
+
2. **Loại Visit**: Inpatient (9201), Outpatient (9202), ER (9203), Telehealth (581477)
|
|
341
|
+
3. **VISIT_DETAIL**: chi tiết khoa/phòng trong 1 visit (đặc biệt nhập viện)
|
|
342
|
+
4. **Mọi clinical events** liên kết vào visit qua `visit_occurrence_id`
|
|
343
|
+
5. **preceding_visit_occurrence_id**: tạo chuỗi visits theo thời gian
|
|
344
|
+
6. **admitted_from / discharged_to**: tracking luồng BN vào-ra
|
|
345
|
+
|
|
346
|
+
**Bài tiếp theo:** Bắt đầu khám phá sự kiện lâm sàng đầu tiên — **CONDITION_OCCURRENCE** — chẩn đoán và bệnh lý.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Tài liệu tham khảo
|
|
351
|
+
|
|
352
|
+
- [OMOP CDM 5.4 — VISIT_OCCURRENCE](https://ohdsi.github.io/CommonDataModel/cdm54.html#VISIT_OCCURRENCE)
|
|
353
|
+
- [OMOP CDM 5.4 — VISIT_DETAIL](https://ohdsi.github.io/CommonDataModel/cdm54.html#VISIT_DETAIL)
|