

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Meminta HealthLake data dengan Amazon Athena
<a name="integrating-athena"></a>

Selama pekerjaan HealthLake impor, data FHIR JSON bersarang mengalami proses ETL dan disimpan dalam [format tabel terbuka Apache Iceberg, di mana setiap jenis sumber daya FHIR direpresentasikan sebagai tabel](https://iceberg.apache.org/) individual di Athena. Hal ini memungkinkan pengguna untuk query data FHIR menggunakan SQL, tetapi tanpa harus mengekspornya terlebih dahulu. Ini berharga, karena memberdayakan dokter dan ilmuwan untuk menanyakan data FHIR untuk memvalidasi keputusan mereka atau memajukan penelitian mereka. *Untuk informasi selengkapnya tentang bagaimana tabel Apache Iceberg berfungsi di Athena, lihat [Menanyakan tabel Apache Iceberg](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg.html) di Panduan Pengguna Athena.*

**catatan**  
HealthLake mendukung `read` interaksi FHIR R4 pada HealthLake data Anda di Athena. Untuk informasi selengkapnya, lihat [Membaca sumber daya FHIR](managing-fhir-resources-read.md).

Topik di bagian ini menjelaskan cara menghubungkan penyimpanan HealthLake data Anda ke Athena, cara menanyakannya menggunakan SQL, dan cara menghubungkan hasil dengan AWS layanan lain untuk analisis lebih lanjut.

**Topics**
+ [Memulai](integrating-athena-getting-started.md)
+ [Query dengan SQL](integrating-athena-query-sql.md)
+ [Kueri contoh](integrating-athena-complex-filtering.md)

# Memulai dengan Amazon Athena
<a name="integrating-athena-getting-started"></a>

Untuk berintegrasi HealthLake dengan Amazon Athena, Anda harus mengatur izin. Untuk melakukan ini, Anda akan membuat pengguna, grup, atau peran Athena, dan memberi mereka akses ke sumber daya FHIR yang terletak di dalam penyimpanan data. HealthLake 
+ [Memberikan pengguna, grup, atau akses peran ke penyimpanan HealthLake data (AWS Lake Formation Console)](#getting-started-athena-admin)
+ [Menyiapkan akun Athena](#getting-started-athena-user)

## Memberikan pengguna, grup, atau akses peran ke penyimpanan HealthLake data (AWS Lake Formation Console)
<a name="getting-started-athena-admin"></a>

**Persona: administrator HealthLake**  
 HealthLake Administrator persona adalah administrator danau data di AWS Lake Formation. Mereka memberikan akses ke penyimpanan HealthLake data di Lake Formation.

Untuk setiap penyimpanan data yang dibuat, ada dua entri yang terlihat di konsol AWS Lake Formation. Satu entri adalah *tautan sumber daya*. Nama tautan sumber daya selalu ditampilkan dalam *huruf miring.* Setiap tautan sumber daya ditampilkan dengan nama dan pemilik sumber daya bersama yang ditautkan. Untuk semua penyimpanan HealthLake data, pemilik sumber daya bersama adalah akun HealthLake layanan. Entri lainnya adalah penyimpanan HealthLake data di akun HealthLake layanan. Langkah-langkah dalam prosedur ini menggunakan penyimpanan data yang merupakan tautan sumber daya.

Untuk mempelajari lebih lanjut tentang tautan sumber daya, lihat [Cara kerja tautan sumber daya di Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) di *Panduan Pengembang AWS Lake Formation*.

Agar pengguna, grup, atau peran dapat menanyakan data di Athena, Anda harus memberikan izin **Jelaskan** pada database sumber daya. Kemudian, Anda harus memberikan **Pilih** dan **Jelaskan** pada tabel.

**LANGKAH 1: Untuk memberikan izin **DESCRIBE** pada database tautan sumber daya penyimpanan HealthLake data**

1. Buka konsol AWS Lake Formation: [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com//lakeformation)

1. Di bilah navigasi utama, pilih **Database**.

1. Pada halaman **Database**, pilih tombol radio di sebelah nama penyimpanan data yang dicetak miring.

1. Pilih **Tindakan (▼)**.

1. Pilih**Izin**.

1. Pada halaman **Berikan izin data**, di bawah **Prinsipal, pilih pengguna atau peran **IAM****.

1. Di bawah **pengguna atau peran IAM**, gunakan **panah bawah (▼)**, atau cari pengguna, peran, atau grup IAM yang ingin Anda ajukan kueri di Athena.

1. Di bawah **LF-tag atau kartu sumber daya katalog**, pilih opsi **Sumber daya katalog data bernama**.

1. Di bawah **Database**, gunakan **panah bawah (▼)** untuk memilih database penyimpanan HealthLake data yang ingin Anda bagikan aksesnya.

1. **Di kartu **izin tautan Sumber daya**, di bawah Izin **tautan sumber daya, pilih Jelaskan**.**

Ketika hibah berhasil, spanduk **sukses izin Hibah** muncul. Untuk melihat izin yang baru saja Anda berikan, pilih **Izin data lake**. Temukan pengguna, grup, dan peran dalam tabel. Di bawah kolom **Izin**, Anda akan melihat **Jelaskan** terdaftar.

Sekarang Anda harus menggunakan **Hibah pada target** untuk memberikan **Pilih** dan **Jelaskan** pada semua tabel dalam database.

**LANGKAH 2: Berikan akses ke semua tabel di tautan sumber daya penyimpanan HealthLake data**

1. Buka konsol AWS Lake Formation: [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com//lakeformation)

1. Di bilah navigasi utama, pilih **Database**.

1. Pada halaman **Database**, pilih tombol radio di sebelah nama penyimpanan data yang dicetak miring.

1. Pilih **Tindakan (▼)**.

1. Pilih **Grant sesuai target**.

1. Pada halaman **Berikan izin data**, di bawah **Prinsipal, pilih pengguna atau peran **IAM****.

1. Di bawah **pengguna atau peran IAM**, gunakan **panah bawah (▼)** atau cari pengguna, grup, atau peran IAM yang ingin Anda ajukan kueri di Athena.

1. Di bawah **LF-tag atau kartu sumber daya katalog**, pilih opsi **Sumber daya katalog data bernama**.

1. Di bawah **Database**, gunakan **panah bawah (▼)** untuk memilih database penyimpanan HealthLake data yang ingin Anda berikan akses.

1. Di bawah **Tabel**, pilih **Semua tabel** untuk berbagi semua tabel dengan HealthLake pengguna.

1. **Di kartu **izin Tabel**, di bawah **Izin tabel**, pilih **Jelaskan** dan Pilih.**

1. Pilih**Izin**.

Setelah memilih hibah, spanduk **sukses izin Hibah** muncul. Pengguna yang ditentukan sekarang dapat membuat kueri pada penyimpanan HealthLake data di Athena.

## Memulai dengan Athena
<a name="getting-started-athena-user"></a>

**HealthLake pengguna**  
 HealthLake Pengguna akan menggunakan konsol Athena, AWS CLI, atau AWS SDKs untuk menanyakan penyimpanan HealthLake data yang dibagikan dengan mereka oleh administrator. HealthLake 

Untuk menanyakan penyimpanan data menggunakan Athena, Anda harus melakukan tiga hal berikut.
+ Berikan pengguna IAM atau akses peran ke penyimpanan HealthLake data melalui Lake Formation. Untuk mempelajari selengkapnya, lihat [Memberikan pengguna, grup, atau akses peran ke penyimpanan HealthLake data (AWS Lake Formation Console)](#getting-started-athena-admin).
+ Buat workgroup untuk penyimpanan HealthLake data Anda.
+ Tentukan bucket Amazon S3 untuk menyimpan hasil kueri Anda.

Untuk memulai Athena, tambahkan kebijakan FullAccess AWS terkelola **AmazonAthenaFullAccess**dan **AmazonS3** ke pengguna, grup, atau peran Anda. Menggunakan kebijakan AWS terkelola adalah cara yang bagus untuk mulai menggunakan layanan baru. Perlu diingat bahwa kebijakan yang dikelola AWS mungkin tidak memberikan izin hak istimewa paling sedikit untuk kasus penggunaan spesifik Anda karena tersedia untuk digunakan oleh semua pelanggan AWS. Saat Anda menetapkan izin dengan kebijakan IAM, berikan hanya izin yang diperlukan untuk melakukan tugas. *Untuk mempelajari IAM selengkapnya dan menerapkan hak istimewa paling sedikit, lihat [Menerapkan izin hak istimewa paling sedikit di Panduan Pengguna IAM.](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-use-aws-defined-policies)*

**penting**  
Untuk menanyakan penyimpanan HealthLake data di Athena, Anda harus menggunakan mesin **Athena versi 3**.

Kelompok kerja adalah sumber daya, dan oleh karena itu Anda dapat menggunakan kebijakan berbasis IAM untuk mengontrol akses ke grup kerja tertentu. Untuk mempelajari selengkapnya, lihat [Menggunakan grup kerja untuk mengontrol akses kueri dan biaya](https://docs.aws.amazon.com/athena/latest/ug/manage-queries-control-costs-with-workgroups.html) di Panduan *Pengguna Athena*.

Untuk mempelajari selengkapnya tentang menyiapkan grup kerja, lihat [https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html](https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html) di Panduan Pengguna *Athena*.

**catatan**  
Wilayah bucket Amazon S3 Anda berada dan konsol Athena harus cocok.

Sebelum Anda dapat menjalankan kueri, kueri hasil bucket lokasi di Amazon S3 harus ditentukan, atau Anda harus menggunakan grup kerja yang telah ditentukan bucket dan konfigurasi yang menimpa pengaturan klien. File output disimpan secara otomatis untuk setiap kueri yang berjalan.

*Untuk detail selengkapnya tentang menentukan lokasi hasil kueri di konsol Athena, [lihat Menentukan lokasi hasil kueri menggunakan konsol Athena di Panduan Pengguna Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/querying.html#query-results-specify-location-console).*

Untuk melihat contoh cara menanyakan penyimpanan HealthLake data Anda di Athena, lihat. [Memeriksa HealthLake data dengan SQL](integrating-athena-query-sql.md)

# Memeriksa HealthLake data dengan SQL
<a name="integrating-athena-query-sql"></a>

Saat Anda mengimpor data FHIR Anda ke penyimpanan HealthLake data, data JSON FHIR bersarang secara bersamaan mengalami proses ETL dan disimpan dalam format tabel terbuka Apache Iceberg di Amazon S3. Setiap jenis sumber daya FHIR dari penyimpanan HealthLake data Anda diubah menjadi tabel, yang dapat ditanyakan menggunakan Amazon Athena. Tabel dapat ditanyakan secara individual atau sebagai grup menggunakan kueri berbasis SQL. Karena struktur penyimpanan data, data Anda diimpor ke Athena sebagai beberapa tipe data yang berbeda. *Untuk mempelajari selengkapnya tentang membuat kueri SQL yang dapat mengakses tipe data ini, lihat [Array kueri dengan tipe kompleks dan struktur bersarang di Panduan Pengguna](https://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.html) Amazon Athena.*

**catatan**  
Semua contoh dalam topik ini menggunakan data fiksi yang dibuat menggunakan Synthea. Untuk mempelajari selengkapnya tentang membuat penyimpanan data yang dimuat sebelumnya dengan data Synthea, lihat. [Membuat penyimpanan HealthLake data](managing-data-stores-create.md)

Untuk setiap elemen dalam tipe sumber daya, spesifikasi FHIR mendefinisikan kardinalitas. Kardinalitas suatu elemen mendefinisikan batas bawah dan atas berapa kali elemen ini dapat muncul. Saat membuat kueri SQL, Anda harus mempertimbangkan hal ini. Sebagai contoh, mari kita lihat beberapa elemen dalam [tipe Sumber Daya: Pasien](https://hl7.org/fhir/R4/patient.html).
+ **Elemen: Nama** Spesifikasi FHIR menetapkan kardinalitas sebagai. `0..*`

  Elemen ditangkap sebagai array.

  ```
  [{
  	id = null,
  	extension = null,
  	use = official,
  	_use = null,
  	text = null,
  	_text = null,
  	family = Wolf938,
  	_family = null,
  	given = [Noel608],
  	_given = null,
  	prefix = null,
  	_prefix = null,
  	suffix = null,
  	_suffix = null,
  	period = null
  }]
  ```

  Di Athena, untuk melihat bagaimana jenis sumber daya telah dicerna, cari di bawah **Tabel** dan tampilan. Untuk mengakses elemen dalam array ini, Anda dapat menggunakan notasi titik. Berikut adalah contoh sederhana yang akan mengakses nilai untuk `given` dan`family`.

  ```
  SELECT
      name[1].given as FirstName,
      name[1].family as LastName
  FROM Patient
  ```
+ **Elemen: MaritalStatus** Spesifikasi FHIR menetapkan kardinalitas sebagai. `0..1`

  Elemen ini ditangkap sebagai JSON.

  ```
  {
  	id = null,
  	extension = null,
  	coding = [
  		{
  			id = null,
  			extension = null,
  			system = http: //terminology.hl7.org/CodeSystem/v3-MaritalStatus,
  				_system = null,
  			version = null,
  			_version = null,
  			code = S,
  			_code = null,
  			display = Never Married,
  			_display = null,
  			userSelected = null,
  			_userSelected = null
  		}
  
  	],
  	text = Never Married,
  	_text = null
  }
  ```

  Di Athena, untuk melihat bagaimana jenis sumber daya telah dicerna, cari di bawah **Tabel** dan tampilan. Untuk mengakses pasangan kunci-nilai di JSON, Anda dapat menggunakan notasi titik. Karena ini bukan array, tidak ada indeks array yang diperlukan. Berikut adalah contoh sederhana yang akan mengakses nilai untuk`text`.

  ```
  SELECT
      maritalstatus.text as MaritalStatus
  FROM Patient
  ```

*Untuk mempelajari lebih lanjut tentang mengakses dan mencari JSON, lihat [Menanyakan JSON di Panduan Pengguna](https://docs.aws.amazon.com//athena/latest/ug/querying-JSON.html) Athena.*

Pernyataan kueri Athena Data Manipulation Language (DHTML) didasarkan pada Trino. *Athena tidak mendukung semua fitur Trino, dan ada perbedaan yang signifikan.* Untuk mempelajari selengkapnya, lihat [kueri, fungsi, dan operator DHTML](https://docs.aws.amazon.com/athena/latest/ug/functions-operators-reference-section.html) di Panduan Pengguna *Amazon Athena*.

Selain itu, Athena mendukung beberapa tipe data yang mungkin Anda temui saat membuat kueri penyimpanan data Anda HealthLake . Untuk mempelajari lebih lanjut tentang tipe data di Athena, lihat [Jenis data di Amazon Athena di](https://docs.aws.amazon.com/athena/latest/ug/data-types.html) Panduan Pengguna Amazon *Athena*.

*Untuk mempelajari lebih lanjut tentang cara kerja kueri SQL di Athena, lihat referensi [SQL untuk Amazon Athena di Panduan Pengguna Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/ddl-sql-reference.html).*

Setiap tab menunjukkan contoh cara mencari pada jenis sumber daya yang ditentukan dan elemen terkait menggunakan Athena.

------
#### [ Element: Extension ]

Elemen `extension` ini digunakan untuk membuat bidang kustom di penyimpanan data.

Contoh ini menunjukkan kepada Anda cara mengakses fitur `extension` elemen yang ditemukan dalam tipe `Patient` sumber daya.

Saat penyimpanan HealthLake data Anda diimpor ke Athena, elemen tipe sumber daya diuraikan secara berbeda. Karena struktur variabel `element` is, itu tidak dapat sepenuhnya ditentukan dalam skema. Untuk menangani variabilitas itu, elemen di dalam array dilewatkan sebagai string.

Dalam deskripsi tabel`Patient`, Anda dapat melihat elemen yang `extension` dijelaskan sebagai`array<string>`, yang berarti Anda dapat mengakses elemen array dengan menggunakan nilai indeks. Namun, untuk mengakses elemen string, Anda harus menggunakan`json_extract`.

Berikut adalah entri tunggal dari `extension` elemen yang ditemukan di tabel pasien.

```
[{
		"valueString": "Kerry175 Cummerata161",
		"url": "http://hl7.org/fhir/StructureDefinition/patient-mothersMaidenName"
	},
	{
		"valueAddress": {
			"country": "DE",
			"city": "Hamburg",
			"state": "Hamburg"
		},
		"url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace"
	},
	{
		"valueDecimal": 0.0,
		"url": "http://synthetichealth.github.io/synthea/disability-adjusted-life-years"
	},
	{
		"valueDecimal": 5.0,
		"url": "http://synthetichealth.github.io/synthea/quality-adjusted-life-years"
	}
]
```

Meskipun ini adalah JSON yang valid, Athena memperlakukannya sebagai string.

Contoh query SQL ini menunjukkan bagaimana Anda dapat membuat tabel yang berisi `patient-mothersMaidenName` dan `patient-birthPlace` elemen. Untuk mengakses elemen-elemen ini, Anda perlu menggunakan indeks array yang berbeda dan `json_extract.`

```
SELECT
    extension[1],
    json_extract(extension[1], '$.valueString') AS MothersMaidenName,
    extension[2],
    json_extract(extension[2], '$.valueAddress.city') AS birthPlace
FROM patient
```

*Untuk mempelajari lebih lanjut tentang kueri yang melibatkan JSON, lihat [Mengekstrak data dari JSON di Panduan Pengguna](https://docs.aws.amazon.com/athena/latest/ug/extracting-data-from-JSON.html) Amazon Athena.*

------
#### [ Element: birthDate (Age) ]

Usia *bukanlah* elemen dari tipe sumber daya Pasien di FHIR. Berikut adalah dua contoh pencarian yang memfilter berdasarkan usia.

Karena usia bukan elemen, kita menggunakan `birthDate` untuk query SQL. Untuk melihat bagaimana elemen telah dicerna ke dalam FHIR, cari nama tabel di bawah **Tabel dan tampilan**. Anda dapat melihat bahwa itu adalah tipe **string**.

**Contoh 1**: Menghitung nilai untuk usia

Dalam contoh query SQL ini, kita menggunakan built-in SQL tool, `current_date` dan `year` untuk mengekstrak komponen-komponen tersebut. Kemudian, kami menguranginya untuk mengembalikan usia sebenarnya pasien sebagai kolom yang disebut`age`.

```
SELECT
	(year(current_date) - year(date(birthdate))) as age
FROM patient
```

**Contoh 2**: Penyaringan untuk pasien yang lahir sebelum `2019-01-01` dan sedang`male`.

Kueri SQL menunjukkan cara menggunakan `CAST` fungsi untuk mentransmisikan `birthDate` elemen sebagai tipe`DATE`, dan cara memfilter berdasarkan dua kriteria dalam `WHERE` klausa. Karena elemen dicerna sebagai tipe **string** secara default, kita harus `CAST` itu sebagai tipe`DATE`. Kemudian Anda dapat menggunakan `<` operator untuk membandingkannya dengan tanggal yang berbeda,`2019-01-01`. Dengan menggunakan`AND`, Anda dapat menambahkan kriteria kedua ke `WHERE` klausa.

```
SELECT birthdate
FROM patient
-- we convert birthdate (varchar) to date  > cast that as date too
WHERE CAST(birthdate AS DATE) < CAST('2019-01-01' AS DATE) AND gender = 'male'
```

------
#### [ Resource type: Location ]

Contoh ini menunjukkan pencarian lokasi dalam jenis sumber daya Lokasi di mana nama kota adalah Attleboro.

```
SELECT *
FROM Location
WHERE address.city='ATTLEBORO'
LIMIT 10;
```

------
#### [ Element: Age ]

```
SELECT birthdate
FROM patient
-- we convert birthdate (varchar) to date  > cast that as date too
WHERE CAST(birthdate AS DATE) < CAST('2019-01-01' AS DATE) AND gender = 'male'
```

------
#### [ Resource type: Condition ]

Kondisi tipe sumber daya menyimpan data diagnosis yang terkait dengan masalah yang telah meningkat ke tingkat kekhawatiran. HealthLakeIntegrated Medical Natural Language Processing (NLP) menghasilkan `Condition` sumber daya *baru* berdasarkan rincian yang ditemukan dalam jenis DocumentReference sumber daya. Saat sumber daya baru dihasilkan, HealthLake tambahkan tag `SYSTEM_GENERATED` ke `meta` elemen. Contoh kueri SQL ini menunjukkan bagaimana Anda dapat mencari tabel kondisi dan mengembalikan hasil di mana `SYSTEM_GENERATED` hasil telah dihapus.

Untuk mempelajari lebih lanjut tentang Integrated HealthLake Natural Language Processing (NLP), lihat. [Pemrosesan bahasa alami terintegrasi (NLP) untuk HealthLake](integrating-nlp.md)

```
SELECT *
FROM condition
WHERE meta.tag[1] is NULL
```

Anda juga dapat mencari dalam elemen string tertentu untuk memfilter kueri Anda lebih lanjut. `modifierextension`Elemen berisi rincian tentang `DocumentReference` sumber daya yang digunakan untuk menghasilkan satu set kondisi. Sekali lagi, Anda harus menggunakan `json_extract` untuk mengakses elemen JSON bersarang yang dibawa ke Athena sebagai string.

Contoh kueri SQL ini menunjukkan bagaimana Anda dapat mencari semua `Condition` yang telah dihasilkan berdasarkan spesifik. `DocumentReference` Gunakan `CAST` untuk mengatur elemen JSON sebagai string sehingga Anda dapat menggunakan `LIKE` untuk membandingkan.

```
SELECT
    meta.tag[1].display as SystemGenerated,
    json_extract(modifierextension[4], '$.valueReference.reference') as DocumentReference
FROM condition
WHERE meta.tag[1].display = 'SYSTEM_GENERATED'

AND CAST(json_extract(modifierextension[4], '$.valueReference.reference') as VARCHAR) LIKE '%DocumentReference/67aa0278-8111-40d0-8adc-43055eb9d18d%'
```

------
#### [ Resource type: Observation ]

Jenis sumber daya, Observasi menyimpan pengukuran dan pernyataan sederhana yang dibuat tentang pasien, perangkat, atau subjek lainnya. HealthLakeIntegrated Natural Language Processing (NLP) menghasilkan `Observation` sumber daya *baru* berdasarkan detail yang ditemukan dalam sumber daya. `DocumentReference` Contoh kueri SQL ini termasuk `WHERE meta.tag[1] is NULL` dikomentari, yang berarti bahwa `SYSTEM_GENERATED` hasilnya disertakan.

```
SELECT valueCodeableConcept.coding[1].code
FROM Observation
WHERE  valueCodeableConcept.coding[1].code = '266919005'
-- WHERE meta.tag[1] is NULL
```

Kolom ini diimpor sebagai file [https://iceberg.apache.org/spec/#schemas-and-data-types](https://iceberg.apache.org/spec/#schemas-and-data-types). Oleh karena itu, Anda dapat mengakses elemen di dalamnya menggunakan notasi titik.

------
#### [ Resource type: MedicationStatement ]

MedicationStatement adalah jenis sumber daya FHIR yang dapat Anda gunakan untuk menyimpan detail tentang obat yang telah dikonsumsi, dikonsumsi, atau akan dikonsumsi pasien di masa depan. HealthLakeIntegrated Medical Natural Language Processing (NLP) menghasilkan MedicationStatement sumber daya baru berdasarkan dokumen yang ditemukan dalam jenis DocumentReference sumber daya. Saat sumber daya baru dihasilkan, HealthLake tambahkan tag `SYSTEM_GENERATED` ke `meta` elemen. Contoh kueri SQL ini menunjukkan cara membuat kueri yang memfilter berdasarkan satu pasien dengan menggunakan pengenal mereka dan menemukan sumber daya yang telah ditambahkan oleh HealthLake NLP terintegrasi.

```
SELECT *
FROM medicationstatement
WHERE meta.tag[1].display = 'SYSTEM_GENERATED' AND subject.reference = 'Patient/0679b7b7-937d-488a-b48d-6315b8e7003b';
```

Untuk mempelajari lebih lanjut tentang Integrated HealthLake Natural Language Processing (NLP), lihat. [Pemrosesan bahasa alami terintegrasi (NLP) untuk HealthLake](integrating-nlp.md)

------

# Contoh kueri SQL dengan penyaringan kompleks
<a name="integrating-athena-complex-filtering"></a>

Contoh berikut menunjukkan cara menggunakan kueri SQL Amazon Athena dengan pemfilteran kompleks untuk menemukan data FHIR dari penyimpanan data. HealthLake 

**Example Buat kriteria penyaringan berdasarkan data demografis**  
Mengidentifikasi demografi pasien yang benar adalah penting saat membuat kohort pasien. Contoh query ini menunjukkan bagaimana Anda dapat menggunakan Trino dot notasi dan `json_extract` untuk memfilter data di penyimpanan data Anda HealthLake .  

```
SELECT
    id
    , CONCAT(name[1].family, ' ', name[1].given[1]) as name
    , (year(current_date) - year(date(birthdate))) as age
    , gender as gender
    , json_extract(extension[1], '$.valueString') as MothersMaidenName
    , json_extract(extension[2], '$.valueAddress.city') as birthPlace
    , maritalstatus.coding[1].display as maritalstatus
    , address[1].line[1] as addressline
    , address[1].city as city
    , address[1].district as district
    , address[1].state as state
    , address[1].postalcode as postalcode
    , address[1].country as country
    , json_extract(address[1].extension[1], '$.extension[0].valueDecimal') as latitude
    , json_extract(address[1].extension[1], '$.extension[1].valueDecimal') as longitude
    , telecom[1].value as telNumber
    , deceasedboolean as deceasedIndicator
    , deceaseddatetime
FROM database.patient;
```
Dengan menggunakan Konsol Athena, Anda dapat mengurutkan dan mengunduh hasilnya lebih lanjut.

**Example Buat filter untuk pasien dan kondisi terkait**  
Contoh query berikut menunjukkan bagaimana Anda dapat menemukan dan mengurutkan semua kondisi terkait untuk pasien yang ditemukan di penyimpanan HealthLake data.  

```
SELECT
	patient.id as patientId
    , condition.id  as conditionId
    , CONCAT(name[1].family, ' ', name[1].given[1]) as name
    , condition.meta.tag[1].display
    , json_extract(condition.modifierextension[1], '$.valueDecimal') AS confidenceScore
    , category[1].coding[1].code as categoryCode
    , category[1].coding[1].display as categoryDescription
    , code.coding[1].code as diagnosisCode
    , code.coding[1].display as diagnosisDescription
    , onsetdatetime
    , severity.coding[1].code as severityCode
    , severity.coding[1].display as severityDescription
    , verificationstatus.coding[1].display as verificationStatus
    , clinicalstatus.coding[1].display as clinicalStatus
    , encounter.reference as encounterId
    , encounter.type as encountertype
FROM database.patient, condition
WHERE CONCAT('Patient/', patient.id) = condition.subject.reference
ORDER BY name;
```
Anda dapat menggunakan konsol Athena untuk mengurutkan hasil lebih lanjut atau mengunduhnya untuk analisis lebih lanjut.

**Example Buat filter untuk pasien dan pengamatan terkait**  
Contoh kueri berikut menunjukkan bagaimana menemukan dan mengurutkan semua pengamatan terkait untuk pasien yang ditemukan di penyimpanan HealthLake data.  

```
SELECT
	patient.id as patientId
    , observation.id as observationId
    , CONCAT(name[1].family, ' ', name[1].given[1]) as name
    , meta.tag[1].display
    , json_extract(modifierextension[1], '$.valueDecimal') AS confidenceScore
    , status
    , category[1].coding[1].code as categoryCode
    , category[1].coding[1].display as categoryDescription
    , code.coding[1].code as observationCode
    , code.coding[1].display as observationDescription
    , effectivedatetime
    , CASE
		WHEN valuequantity.value IS NOT NULL THEN CONCAT(CAST(valuequantity.value AS VARCHAR),' ',valuequantity.unit)
      	WHEN valueCodeableConcept.coding [ 1 ].code IS NOT NULL THEN CAST(valueCodeableConcept.coding [ 1 ].code AS VARCHAR)
      	WHEN valuestring IS NOT NULL THEN CAST(valuestring AS VARCHAR)
      	WHEN valueboolean IS NOT NULL THEN CAST(valueboolean AS VARCHAR)
      	WHEN valueinteger IS NOT NULL THEN CAST(valueinteger AS VARCHAR)
      	WHEN valueratio IS NOT NULL THEN CONCAT(CAST(valueratio.numerator.value AS VARCHAR),'/',CAST(valueratio.denominator.value AS VARCHAR))
      	WHEN valuerange IS NOT NULL THEN CONCAT(CAST(valuerange.low.value AS VARCHAR),'-',CAST(valuerange.high.value AS VARCHAR))
      	WHEN valueSampledData IS NOT NULL THEN CAST(valueSampledData.data AS VARCHAR)
      	WHEN valueTime IS NOT NULL THEN CAST(valueTime AS VARCHAR)
      	WHEN valueDateTime IS NOT NULL THEN CAST(valueDateTime AS VARCHAR)
      	WHEN valuePeriod IS NOT NULL THEN valuePeriod.start
      	WHEN component[1] IS NOT NULL THEN CONCAT(CAST(component[2].valuequantity.value AS VARCHAR),' ',CAST(component[2].valuequantity.unit AS VARCHAR), '/', CAST(component[1].valuequantity.value AS VARCHAR),' ',CAST(component[1].valuequantity.unit AS VARCHAR))
    END AS observationvalue
	, encounter.reference as encounterId
    , encounter.type as encountertype
FROM database.patient, observation
WHERE CONCAT('Patient/', patient.id) = observation.subject.reference
ORDER BY name;
```

**Example Buat kondisi penyaringan untuk pasien dan prosedur terkait**  
Menghubungkan prosedur dengan pasien merupakan aspek penting dari perawatan kesehatan. Contoh query SQL berikut menunjukkan bagaimana menggunakan FHIR `Patient` dan jenis `Procedure` sumber daya untuk mencapai hal ini. Kueri SQL berikut akan mengembalikan semua pasien dan prosedur terkait mereka yang ditemukan di penyimpanan HealthLake data Anda.  

```
SELECT
	patient.id  as patientId
	, PROCEDURE.id as procedureId
	, CONCAT(name[1].family, ' ', name[1].given[1]) as name
	, status
	, category.coding[1].code as categoryCode
	, category.coding[1].display as categoryDescription
	, code.coding[1].code as procedureCode
	, code.coding[1].display as procedureDescription
	, performeddatetime
	, performer[1]
	, encounter.reference as encounterId
	, encounter.type as encountertype
FROM database.patient, procedure
WHERE CONCAT('Patient/', patient.id) = procedure.subject.reference
ORDER BY name;
```
Anda dapat menggunakan konsol Athena untuk mengunduh hasil untuk analisis lebih lanjut atau mengurutkannya untuk lebih memahami hasilnya.

**Example Buat kondisi penyaringan untuk pasien dan resep terkait**  
Melihat daftar obat saat ini yang dikonsumsi pasien adalah penting. Menggunakan Athena, Anda dapat menulis kueri SQL yang menggunakan jenis `MedicationRequest` sumber daya `Patient` dan sumber daya yang ditemukan di penyimpanan data Anda HealthLake .  
Kueri SQL berikut bergabung dengan `Patient` dan `MedicationRequest` tabel diimpor ke Athena. Ini juga mengatur resep ke dalam entri masing-masing dengan menggunakan notasi titik.  

```
SELECT
	patient.id  as patientId
	, medicationrequest.id  as medicationrequestid
	, CONCAT(name[1].family, ' ', name[1].given[1]) as name
	, status
	, statusreason.coding[1].code as categoryCode
	, statusreason.coding[1].display as categoryDescription
	, category[1].coding[1].code as categoryCode
	, category[1].coding[1].display as categoryDescription
	, priority
	, donotperform
	, encounter.reference as encounterId
	, encounter.type as encountertype
	, medicationcodeableconcept.coding[1].code as medicationCode
	, medicationcodeableconcept.coding[1].display as medicationDescription
	, dosageinstruction[1].text as dosage
FROM database.patient, medicationrequest
WHERE CONCAT('Patient/', patient.id ) = medicationrequest.subject.reference
ORDER BY name
```
Anda dapat menggunakan konsol Athena untuk mengurutkan hasil atau mengunduhnya untuk analisis lebih lanjut.

**Example Lihat obat yang ditemukan dalam jenis `MedicationStatement` sumber daya**  
Contoh kueri berikut menunjukkan cara mengatur JSON bersarang yang diimpor ke Athena menggunakan SQL. Kueri menggunakan `meta` elemen FHIR untuk menunjukkan kapan obat telah ditambahkan oleh HealthLake pemrosesan bahasa alami terintegrasi (NLP). Ini juga digunakan `json_extract` untuk mencari data di dalam array string JSON. Untuk informasi selengkapnya, lihat [Pemrosesan bahasa alami](integrating-nlp.md).  

```
SELECT
	medicationcodeableconcept.coding[1].code as medicationCode
	, medicationcodeableconcept.coding[1].display as medicationDescription
	, meta.tag[1].display
	, json_extract(modifierextension[1], '$.valueDecimal') AS confidenceScore
FROM medicationstatement;
```
Anda dapat menggunakan konsol Athena untuk mengunduh hasil ini atau mengurutkannya.

**Example Filter untuk jenis penyakit tertentu**  
Contoh ini menunjukkan bagaimana Anda dapat menemukan sekelompok pasien, berusia 18 hingga 75 tahun, yang telah didiagnosis menderita diabetes.  

```
SELECT patient.id as patientId,
	condition.id as conditionId,
	CONCAT(name [ 1 ].family, ' ', name [ 1 ].given [ 1 ]) as name,
	(year(current_date) - year(date(birthdate))) AS age,
	CASE
		WHEN condition.encounter.reference IS NOT NULL THEN condition.encounter.reference
		WHEN observation.encounter.reference IS NOT NULL THEN observation.encounter.reference
	END as encounterId,
	CASE
		WHEN condition.encounter.type IS NOT NULL THEN observation.encounter.type
		WHEN observation.encounter.type IS NOT NULL THEN observation.encounter.type
	END AS encountertype,
	condition.code.coding [ 1 ].code as diagnosisCode,
	condition.code.coding [ 1 ].display as diagnosisDescription,
	observation.category [ 1 ].coding [ 1 ].code as categoryCode,
	observation.category [ 1 ].coding [ 1 ].display as categoryDescription,
	observation.code.coding [ 1 ].code as observationCode,
	observation.code.coding [ 1 ].display as observationDescription,
	effectivedatetime AS observationDateTime,
	CASE
      WHEN valuequantity.value IS NOT NULL THEN CONCAT(CAST(valuequantity.value AS VARCHAR),' ',valuequantity.unit)
      WHEN valueCodeableConcept.coding [ 1 ].code IS NOT NULL THEN CAST(valueCodeableConcept.coding [ 1 ].code AS VARCHAR)
      WHEN valuestring IS NOT NULL THEN CAST(valuestring AS VARCHAR)
      WHEN valueboolean IS NOT NULL THEN CAST(valueboolean AS VARCHAR)
      WHEN valueinteger IS NOT NULL THEN CAST(valueinteger AS VARCHAR)
      WHEN valueratio IS NOT NULL THEN CONCAT(CAST(valueratio.numerator.value AS VARCHAR),'/',CAST(valueratio.denominator.value AS VARCHAR))
      WHEN valuerange IS NOT NULL THEN CONCAT(CAST(valuerange.low.value AS VARCHAR),'-',CAST(valuerange.high.value AS VARCHAR))
      WHEN valueSampledData IS NOT NULL THEN CAST(valueSampledData.data AS VARCHAR)
      WHEN valueTime IS NOT NULL THEN CAST(valueTime AS VARCHAR)
      WHEN valueDateTime IS NOT NULL THEN CAST(valueDateTime AS VARCHAR)
      WHEN valuePeriod IS NOT NULL THEN valuePeriod.start
      WHEN component[1] IS NOT NULL THEN CONCAT(CAST(component[2].valuequantity.value AS VARCHAR),' ',CAST(component[2].valuequantity.unit AS VARCHAR), '/', CAST(component[1].valuequantity.value AS VARCHAR),' ',CAST(component[1].valuequantity.unit AS VARCHAR))
    END AS observationvalue,
	CASE
		WHEN condition.meta.tag [ 1 ].display = 'SYSTEM GENERATED' THEN 'YES'
		WHEN condition.meta.tag [ 1 ].display IS NULL THEN 'NO'
		WHEN observation.meta.tag [ 1 ].display = 'SYSTEM GENERATED' THEN 'YES'
		WHEN observation.meta.tag [ 1 ].display IS NULL THEN 'NO'
  	END AS IsSystemGenerated,
  CAST(
    json_extract(
      condition.modifierextension [ 1 ],
      '$.valueDecimal'
    ) AS int
  ) AS confidenceScore
FROM database.patient,
	database.condition,
	database.observation
WHERE CONCAT('Patient/', patient.id) = condition.subject.reference
	AND CONCAT('Patient/', patient.id) = observation.subject.reference
  	AND (year(current_date) - year(date(birthdate))) >= 18
  	AND (year(current_date) - year(date(birthdate))) <= 75
  	AND condition.code.coding [ 1 ].display like ('%diabetes%');
```
Sekarang Anda dapat menggunakan konsol Athena untuk mengurutkan hasil atau mengunduhnya untuk analisis lebih lanjut.