前幾篇文章主要介紹Patient的讀取、搜尋及Bundle。
Patient Resource可以記錄病人的姓名、生日、聯絡方式及病歷號等基本行政資料,但不適合拿來記錄病人的體溫、血壓或抽血結果。
在FHIR中,許多測量、檢驗及臨床觀察資料會使用Observation Resource表示,例如:
今天不進行任何實際操作,而是透過一份虛構的體溫Observation,認識它的重要欄位及設計概念。
本文中的病人、時間及醫療資料皆為虛構教學範例,不代表任何真實人物或醫療判斷。
Observation用來記錄對病人、裝置或其他對象進行觀察、檢驗或測量後所得到的結果。
可以簡單理解成:
觀察了什麼、在什麼時間觀察、觀察對象是誰,以及得到了什麼結果。
一筆Observation通常需要回答:
FHIR官方將Observation應用於許多健康照護測量及臨床資料。
Observation的用途很廣,但不是所有醫療資訊都應放入Observation。後面會再比較Observation、Condition及DiagnosticReport的差異。
以下是一份簡化的FHIR R4 Observation:
{
"resourceType": "Observation",
"id": "temperature-001",
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
],
"text": "生命徵象"
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "體溫"
},
"subject": {
"reference": "Patient/patient-001",
"display": "王小明"
},
"encounter": {
"reference": "Encounter/encounter-001",
"display": "2026年9月3日門診"
},
"effectiveDateTime": "2026-09-03T09:05:00+08:00",
"issued": "2026-09-03T09:06:00+08:00",
"performer": [
{
"reference": "Practitioner/nurse-001",
"display": "陳護理師"
}
],
"valueQuantity": {
"value": 37.2,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
},
"interpretation": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
"code": "N",
"display": "Normal"
}
],
"text": "正常"
}
],
"referenceRange": [
{
"low": {
"value": 36.0,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
},
"high": {
"value": 37.5,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
},
"text": "範例參考範圍:36.0~37.5°C"
}
]
}
這份範例描述:
王小明在2026年9月3日門診期間,由陳護理師量測體溫,結果為37.2°C,狀態為final,並被標示為正常。
其中的參考範圍只是為了說明FHIR資料結構而建立的虛構數值,不能用來進行實際醫療判斷。真實參考範圍會受到量測部位、方法、設備、年齡及醫療機構規範等因素影響。
"resourceType": "Observation",
"id": "temperature-001"
resourceType表示這是一筆Observation Resource。
id則是這筆Resource在FHIR Server中的邏輯識別碼。
它的邏輯位置可能是:
Observation/temperature-001
id不是檢驗代碼,也不是病人的病歷號。
"status": "final"
status是Observation的重要必填欄位,用來表示結果目前處於哪個階段。
FHIR R4常見的Observation狀態包括:
| 代碼 | 基本意義 |
|---|---|
registered |
已登錄,但尚未取得結果 |
preliminary |
初步結果 |
final |
最終結果 |
amended |
最終結果後又經過修正 |
corrected |
已更正 |
cancelled |
已取消 |
entered-in-error |
資料輸入錯誤 |
unknown |
狀態未知 |
preliminary表示結果仍可能變動,例如檢驗尚未完成全部確認。
final表示結果已完成,通常可被視為正式結果。
不過,final之後仍可能因特殊原因被修正,這時可能使用amended或corrected。
醫療系統不能忽略status,因為同一個數值在初步結果與最終結果中的意義不同。
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
],
"text": "生命徵象"
}
]
category用來將Observation歸入較大的類別。
常見類別包括:
| category code | 基本意義 |
|---|---|
vital-signs |
生命徵象 |
laboratory |
實驗室檢驗 |
imaging |
影像相關觀察 |
survey |
問卷或調查 |
exam |
身體檢查結果 |
social-history |
社會史 |
procedure |
處置相關觀察 |
therapy |
治療相關觀察 |
activity |
活動相關資料 |
體溫屬於生命徵象,所以範例使用:
vital-signs
category只是較大的分類,還不能完整說明測量項目到底是體溫、心跳還是血壓。
要知道具體項目,需要查看code。
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "體溫"
}
code表示Observation實際測量或觀察的項目。
它使用CodeableConcept資料型別,可以同時包含:
範例使用LOINC:
| 欄位 | 內容 |
|---|---|
system |
http://loinc.org |
code |
8310-5 |
display |
Body temperature |
text |
體溫 |
其中:
system+code協助電腦辨認測量項目。display及text協助人類閱讀。| 欄位 | 回答的問題 | 體溫範例 |
|---|---|---|
category |
這是哪一大類資料? | 生命徵象 |
code |
實際觀察或測量什麼? | 體溫 |
例如,體溫和心跳可能都屬於:
vital-signs
但是兩者的code不同。
因此,只看category不能確定Observation的實際測量項目。
"subject": {
"reference": "Patient/patient-001",
"display": "王小明"
}
subject用來表示Observation的對象。
在這個例子中:
Patient/patient-001
代表這筆體溫屬於王小明。
display只是方便人類閱讀,真正的Resource關係由reference建立。
Observation的subject不一定只能是Patient。依照不同情境,也可能指向:
不過,在一般病人檢驗及生命徵象資料中,subject通常是Patient。
"encounter": {
"reference": "Encounter/encounter-001",
"display": "2026年9月3日門診"
}
encounter用來連結產生這筆Observation的就醫事件。
有了這段Reference,系統就能知道:
同一位病人可能有許多次門診、急診或住院紀錄,因此連結Encounter能提供更完整的醫療情境。
"effectiveDateTime": "2026-09-03T09:05:00+08:00"
effectiveDateTime表示Observation在臨床上發生或有效的時間。
在這個例子中,它代表體溫實際量測的時間。
可以拆成:
| 部分 | 意義 |
|---|---|
2026-09-03 |
日期 |
T |
日期與時間分隔 |
09:05:00 |
時、分、秒 |
+08:00 |
UTC+8時區 |
Observation也可能使用其他effective[x]形式,例如:
effectiveDateTime
effectivePeriod
effectiveTiming
effectiveInstant
其中的[x]表示這個欄位可以選擇規範允許的其中一種資料型別。
不能在JSON中直接寫:
"effective[x]": "..."
而要依照實際型別寫成:
"effectiveDateTime": "..."
或:
"effectivePeriod": {
"start": "...",
"end": "..."
}
"issued": "2026-09-03T09:06:00+08:00"
issued表示這筆結果被正式提供或發布的時間。
它和effectiveDateTime不一定相同。
| 欄位 | 意義 |
|---|---|
effectiveDateTime |
觀察或測量實際發生時間 |
issued |
結果對外提供或發布的時間 |
例如:
臨床事件時間與結果發布時間可能不同,因此FHIR使用不同欄位表示。
"performer": [
{
"reference": "Practitioner/nurse-001",
"display": "陳護理師"
}
]
performer表示負責這項Observation的人員、機構或裝置。
可能指向:
因為performer可以有一位以上,所以使用Array。
performer不一定是實際按下測量設備按鈕的人,也可能表示對結果負責或執行觀察的角色,需要依照實際情境及Profile定義。
"valueQuantity": {
"value": 37.2,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
}
valueQuantity表示具有數值及單位的結果。
可以拆成:
| 欄位 | 內容 | 用途 |
|---|---|---|
value |
37.2 |
測量數值 |
unit |
°C |
人類閱讀的單位 |
system |
http://unitsofmeasure.org |
單位代碼系統 |
code |
Cel |
標準化單位代碼 |
只提供:
"value": 37.2
是不夠的,因為接收方不知道數值使用攝氏、華氏或其他單位。
FHIR常搭配UCUM表示測量單位,讓系統能更準確地處理及比較數值。
不同Observation會使用不同的value[x]型別。
常見形式包括:
| 欄位 | 適合的結果 |
|---|---|
valueQuantity |
數值及單位 |
valueCodeableConcept |
代碼化結果 |
valueString |
一般文字 |
valueBoolean |
是或否 |
valueInteger |
整數 |
valueRange |
數值範圍 |
valueRatio |
比例 |
valueTime |
時間 |
valueDateTime |
日期及時間 |
valuePeriod |
一段期間 |
例如,吸菸狀態可能使用:
"valueCodeableConcept": {
"coding": [
{
"system": "https://example.org/CodeSystem/smoking-status",
"code": "never",
"display": "Never smoker"
}
],
"text": "從未吸菸"
}
是否懷孕等特定觀察情境可能使用Boolean:
"valueBoolean": false
不能在同一筆Observation中隨意同時使用多種value[x]結果。應依照該Observation的用途、Profile及規範選擇合適型別。
"interpretation": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
"code": "N",
"display": "Normal"
}
],
"text": "正常"
}
]
interpretation提供對結果的分類性解讀,例如:
常見概念包括:
| 代碼 | 常見意義 |
|---|---|
N |
正常 |
A |
異常 |
H |
偏高 |
L |
偏低 |
HH |
嚴重偏高 |
LL |
嚴重偏低 |
實際可使用哪些代碼,需要依照FHIR規範、ValueSet及Profile判斷。
interpretation不是單純由任何Client看到數值後自行填寫,而通常來自產生或審核結果的醫療系統。
"referenceRange": [
{
"low": {
"value": 36.0,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
},
"high": {
"value": 37.5,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
},
"text": "範例參考範圍:36.0~37.5°C"
}
]
referenceRange表示結果的參考範圍。
常見欄位包括:
low
high
type
appliesTo
age
text
參考範圍可能受到以下因素影響:
所以FHIR允許一筆Observation包含多組referenceRange。
需要注意:
參考範圍不是單獨判定疾病的標準。
醫療結果仍需要由具有資格的醫療專業人員,配合症狀、病史、其他檢查及臨床情境判讀。
不是每一筆Observation都有結果。
可能原因包括:
FHIR可以使用dataAbsentReason說明缺少結果的原因。
例如:
"dataAbsentReason": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/data-absent-reason",
"code": "not-performed",
"display": "Not Performed"
}
],
"text": "未執行"
}
這比直接刪除value[x]卻不說明原因更清楚。
一般情況下,如果已經提供value[x],就不應再同時使用dataAbsentReason表示沒有資料。
"bodySite": {
"text": "口腔"
}
bodySite可以表示觀察或測量的身體部位。
以體溫為例,不同部位可能包括:
對部分臨床資料來說,測量部位會影響結果的解讀,因此不能只記錄數值。
實際使用時,應盡量使用適當標準代碼,而不是只放自由文字。
"method": {
"text": "電子體溫計測量"
}
method用來表示取得Observation結果的方法。
例如,同一種檢驗項目可能因:
而具有不同意義或參考範圍。
如果方法會影響結果解讀,就需要在資料中清楚表示。
實驗室檢驗可能需要連結Specimen Resource:
"specimen": {
"reference": "Specimen/specimen-001",
"display": "血液檢體"
}
Specimen可能記錄:
例如,測量的是血清、血漿還是全血,可能影響檢驗項目的意義。
生命徵象通常不一定需要Specimen,但實驗室Observation經常與Specimen有關。
Observation也可能記錄產生資料的裝置:
"device": {
"reference": "Device/thermometer-001",
"display": "範例電子體溫計"
}
Device Resource可以進一步描述:
如果結果受到特定儀器或裝置影響,保留Device Reference有助於追蹤資料來源。
有些觀察由多個相關數值共同組成。
最常見的例子是血壓,包括:
這兩個數值屬於同一次血壓測量,可以放在同一筆Observation的component中。
簡化結構如下:
{
"resourceType": "Observation",
"status": "final",
"code": {
"text": "血壓"
},
"subject": {
"reference": "Patient/patient-001"
},
"component": [
{
"code": {
"text": "收縮壓"
},
"valueQuantity": {
"value": 120,
"unit": "mmHg"
}
},
{
"code": {
"text": "舒張壓"
},
"valueQuantity": {
"value": 80,
"unit": "mmHg"
}
}
]
}
component中的每一項都有自己的:
code
value[x]
dataAbsentReason
interpretation
referenceRange
下一篇將專門介紹血壓Observation及component。
記錄觀察、測量或檢驗所得的結果。
例如:
記錄疾病、健康問題或診斷。
例如:
可以比較:
| Resource | 回答的問題 |
|---|---|
| Observation | 觀察或測量到什麼結果? |
| Condition | 病人有哪些疾病、問題或診斷? |
一筆血壓偏高的Observation不一定能直接等同於高血壓Condition。診斷需要由醫療專業人員綜合判斷。
DiagnosticReport通常用來整理一份診斷性檢查或檢驗報告。
例如,一份血液檢驗報告可能包含:
DiagnosticReport可以透過result Reference連結多筆Observation。
可以簡化理解:
| Resource | 主要用途 |
|---|---|
| Observation | 單項或一組相關的觀察結果 |
| DiagnosticReport | 將多項結果及報告內容組織成一份報告 |
Observation提供較細的結果資料,DiagnosticReport則提供報告層級的整體資訊。
可以將Observation整理成:
Observation
├── status:結果狀態
├── category:資料大類
├── code:觀察項目
├── subject:資料屬於誰
├── encounter:與哪次就醫有關
├── effective[x]:觀察發生時間
├── issued:結果發布時間
├── performer:由誰產生
├── value[x]:觀察結果
├── interpretation:結果解讀
├── referenceRange:參考範圍
├── dataAbsentReason:缺少結果的原因
├── bodySite:身體部位
├── method:觀察方法
├── specimen:檢體
├── device:使用裝置
└── component:多組相關結果
實際Observation不一定同時包含所有欄位,需要依照資料內容、FHIR規範及Profile決定。
今天認識了FHIR Observation Resource。
Observation可以表示生命徵象、實驗室檢驗、身體測量、問卷結果及其他臨床觀察。
重要欄位包括:
status
category
code
subject
encounter
effective[x]
issued
performer
value[x]
interpretation
referenceRange
dataAbsentReason
component
其中最重要的觀念是:
Observation的
code說明測量什麼,value[x]則說明測量結果。
數值不能脫離測量項目、單位、時間及狀態單獨解讀。同樣地,一筆異常Observation也不能直接等同於某項疾病診斷。
下一篇將以血壓為例,深入介紹為什麼一筆Observation中需要使用component表示收縮壓及舒張壓。
Day 21|血壓為什麼需要兩個數值?
HL7 FHIR R4:Observation
https://hl7.org/fhir/R4/observation.html
HL7 FHIR R4:Observation Definitions
https://hl7.org/fhir/R4/observation-definitions.html
HL7 FHIR R4:Vital Signs Profile
https://hl7.org/fhir/R4/vital-signs.html
HL7 FHIR R4:DiagnosticReport
https://hl7.org/fhir/R4/diagnosticreport.html
HL7 FHIR R4:Condition
https://hl7.org/fhir/R4/condition.html
LOINC:About LOINC
https://loinc.org/about/