@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.
Files changed (37) hide show
  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. package/content/series/architecture/omop-cdm-5-4-cho-nguoi-moi-bat-dau/index.md +385 -0
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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 &amp; VISIT_DETAIL</tspan>
42
+ <tspan x="60" dy="42">Lượt khám &amp; 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 &amp; 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)