

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# HealthLake Daten mit Amazon Athena abfragen
<a name="integrating-athena"></a>

Während eines HealthLake Importjobs werden verschachtelte FHIR-JSON-Daten einem ETL-Prozess unterzogen und im [offenen Tabellenformat von Apache Iceberg gespeichert, wobei jeder FHIR-Ressourcentyp als einzelne Tabelle](https://iceberg.apache.org/) in Athena dargestellt wird. Auf diese Weise können Benutzer die FHIR-Daten mit SQL abfragen, ohne sie jedoch zuerst exportieren zu müssen. Dies ist wertvoll, da es Klinikern und Wissenschaftlern ermöglicht, FHIR-Daten abzufragen, um ihre Entscheidungen zu validieren oder ihre Forschung voranzutreiben. Weitere Informationen zur Funktionsweise von Apache Iceberg-Tabellen in Athena finden Sie unter [Abfragen von Apache Iceberg-Tabellen](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg.html) im *Athena-Benutzerhandbuch*.

**Anmerkung**  
HealthLake unterstützt die FHIR `read` R4-Interaktion mit Ihren HealthLake Daten in Athena. Weitere Informationen finden Sie unter [Eine FHIR-Ressource lesen](managing-fhir-resources-read.md).

In den Themen dieses Abschnitts wird beschrieben, wie Sie Ihren HealthLake Datenspeicher mit Athena verbinden, wie Sie ihn mit SQL abfragen und wie Sie Ergebnisse für weitere Analysen mit anderen AWS Diensten verbinden.

**Topics**
+ [Erste Schritte](integrating-athena-getting-started.md)
+ [Abfragen mit SQL](integrating-athena-query-sql.md)
+ [Beispielabfragen](integrating-athena-complex-filtering.md)

# Erste Schritte mit Amazon Athena
<a name="integrating-athena-getting-started"></a>

Für die Integration HealthLake mit Amazon Athena müssen Sie Berechtigungen einrichten. Dazu erstellen Sie einen Athena-Benutzer, eine Gruppe oder eine Rolle und gewähren ihnen Zugriff auf FHIR-Ressourcen, die sich in einem HealthLake Datenspeicher befinden.
+ [Einem Benutzer, einer Gruppe oder einer Rolle Zugriff auf einen HealthLake Datenspeicher gewähren (AWS Lake Formation Console)](#getting-started-athena-admin)
+ [Einrichtung eines Athena-Kontos](#getting-started-athena-user)

## Einem Benutzer, einer Gruppe oder einer Rolle Zugriff auf einen HealthLake Datenspeicher gewähren (AWS Lake Formation Console)
<a name="getting-started-athena-admin"></a>

**Person: Administrator HealthLake**  
Die HealthLake Administrator-Persona ist ein Data Lake-Administrator in AWS Lake Formation. Sie gewähren Zugriff auf HealthLake Datenspeicher in Lake Formation.

Für jeden erstellten Datenspeicher sind zwei Einträge in der AWS Lake Formation Formation-Konsole sichtbar. Ein Eintrag ist ein *Ressourcenlink*. Namen von Ressourcenlinks werden immer *kursiv* angezeigt. Jeder Ressourcenlink wird mit dem Namen und dem Besitzer der verknüpften gemeinsam genutzten Ressource angezeigt. Für alle HealthLake Datenspeicher ist der Besitzer der gemeinsam genutzten Ressource das HealthLake Dienstkonto. Der andere Eintrag ist der HealthLake Datenspeicher im HealthLake Dienstkonto. Die Schritte in diesem Verfahren verwenden den Datenspeicher, der die Ressourcenverknüpfung darstellt.

Weitere Informationen zu Ressourcenlinks finden Sie unter [So funktionieren Ressourcenlinks in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) im *AWS Lake Formation Developer Guide*.

Damit ein Benutzer, eine Gruppe oder eine Rolle Daten in Athena abfragen kann, müssen Sie die **Describe-Berechtigung** für die Ressourcendatenbank erteilen. Anschließend müssen Sie den Tabellen die **Optionen Select** und **Describe** gewähren.

**SCHRITT 1: So gewähren **Sie DESCRIBE-Berechtigungen** für eine HealthLake Data Store-Resource Link-Datenbank**

1. Öffnen Sie die AWS Lake Formation Formation-Konsole: [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com//lakeformation)

1. Wählen Sie in der primären Navigationsleiste **Datenbanken** aus.

1. Wählen Sie auf der Seite **Datenbanken** das Optionsfeld neben dem Namen des Datenspeichers, der kursiv gedruckt ist.

1. Wählen Sie **Aktionen (▼)**.

1. Wählen Sie **Grant (Erteilen)**.

1. Wählen Sie auf der Seite **Datenberechtigungen gewähren** unter **Principals** die Option **IAM-Benutzer oder** -Rollen aus.

1. Verwenden Sie unter **IAM-Benutzer oder -Rollen** den **Abwärtspfeil (▼)**, oder suchen Sie nach dem IAM-Benutzer, der Rolle oder der Gruppe, zu der Sie in Athena Abfragen stellen möchten.

1. Wählen Sie auf der Karte **LF-Tags oder Katalogressourcen** die Option **Benannte** Datenkatalogressourcen aus.

1. Wählen Sie unter **Datenbanken** mit dem **Abwärtspfeil (▼)** die HealthLake Datenspeicher-Datenbank aus, auf die Sie gemeinsam zugreifen möchten.

1. Wählen Sie auf der Karte **Berechtigungen für Ressourcenlinks** unter Berechtigungen für **Ressourcenverknüpfungen** die Option **Beschreiben** aus.

Wenn die Erteilung erfolgreich war, wird das Banner „**Genehmigung erteilt**“ angezeigt. Um die soeben erteilte Berechtigung einzusehen, wählen Sie **Data Lake-Berechtigungen** aus. Suchen Sie den Benutzer, die Gruppe und die Rolle in der Tabelle. In der Spalte **Berechtigungen** wird **Describe** aufgeführt.

Jetzt müssen Sie **Grant on target** verwenden, um **Select** und **Describe** für alle Tabellen in der Datenbank zu gewähren.

**SCHRITT 2: Gewähren Sie Zugriff auf alle Tabellen in einem HealthLake Datenspeicher-Ressourcenlink**

1. Öffnen Sie die AWS Lake Formation Formation-Konsole: [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com//lakeformation)

1. Wählen Sie in der primären Navigationsleiste **Datenbanken** aus.

1. Wählen Sie auf der Seite **Datenbanken** das Optionsfeld neben dem Namen des Datenspeichers, der kursiv gedruckt ist.

1. Wählen Sie **Aktionen (▼)**.

1. Wählen Sie **Grant on target** aus.

1. Wählen Sie auf der Seite **Datenberechtigungen gewähren** unter **Principals** die Option **IAM-Benutzer oder** -Rollen aus.

1. Verwenden Sie unter **IAM-Benutzer oder -Rollen** den **Abwärtspfeil (▼)** oder suchen Sie nach dem IAM-Benutzer, der Gruppe oder der Rolle, zu der Sie in Athena Abfragen stellen möchten.

1. Wählen Sie unter **LF-Tags oder Katalogressourcen** die Option **Benannte** Datenkatalogressourcen aus.

1. Wählen Sie unter **Datenbanken** mit dem **Abwärtspfeil (▼)** die HealthLake Datenspeicher-Datenbank aus, auf die Sie Zugriff gewähren möchten.

1. Wählen Sie unter **Tabellen** die Option **Alle Tabellen** aus, um alle Tabellen für einen HealthLake Benutzer freizugeben.

1. Wählen Sie auf der Karte **Tabellenberechtigungen** unter **Tabellenberechtigungen** die Option **Beschreiben** und **auswählen aus**.

1. Wählen Sie **Grant (Erteilen)**.

Nachdem Sie „Gewähren“ ausgewählt haben, wird das **Erfolgsbanner „Berechtigungen gewähren**“ angezeigt. Der angegebene Benutzer kann jetzt Abfragen an einem HealthLake Datenspeicher in Athena stellen.

## Erste Schritte mit Athena
<a name="getting-started-athena-user"></a>

**HealthLake Nutzer**  
Der HealthLake Benutzer verwendet die Athena-Konsole oder AWS SDKs fragt einen HealthLake Datenspeicher ab AWS CLI, der ihm vom HealthLake Administrator zur Verfügung gestellt wurde.

Um einen Datenspeicher mit Athena abzufragen, müssen Sie die folgenden drei Dinge tun.
+ Gewähren Sie dem IAM-Benutzer oder der IAM-Rolle über Lake Formation Zugriff auf den HealthLake Datenspeicher. Weitere Informationen hierzu finden Sie unter [Einem Benutzer, einer Gruppe oder einer Rolle Zugriff auf einen HealthLake Datenspeicher gewähren (AWS Lake Formation Console)](#getting-started-athena-admin).
+ Erstellen Sie eine Arbeitsgruppe für Ihren HealthLake Datenspeicher.
+ Benennen Sie einen Amazon S3 S3-Bucket zum Speichern Ihrer Abfrageergebnisse.

Um mit Athena zu beginnen, fügen Sie Ihrem Benutzer, Ihrer Gruppe **oder Rolle die FullAccess AWS verwalteten Richtlinien **AmazonAthenaFullAccess**und AmazonS3** hinzu. Die Verwendung einer AWS verwalteten Richtlinie ist eine hervorragende Möglichkeit, um mit der Nutzung eines neuen Dienstes zu beginnen. Beachten Sie, dass von AWS verwaltete Richtlinien möglicherweise keine Least-Privilege-Berechtigungen für Ihre speziellen Anwendungsfälle gewähren, da sie für alle AWS-Kunden verfügbar sind. Gewähren Sie die Berechtigungen mit IAM Richtlinien nur die zum Ausführen einer Aufgabe erforderlich sind. *Weitere Informationen zu IAM und der Anwendung von Least-Privilege-Berechtigungen finden Sie im IAM-Benutzerhandbuch unter [Anwenden](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-use-aws-defined-policies) von Least-Privilege-Berechtigungen.*

**Wichtig**  
Um einen HealthLake Datenspeicher in Athena abzufragen, müssen Sie die **Athena-Engine Version** 3 verwenden.

Arbeitsgruppen sind Ressourcen, und daher können Sie IAM-basierte Richtlinien verwenden, um den Zugriff auf bestimmte Arbeitsgruppen zu steuern. Weitere Informationen finden Sie im *Athena-Benutzerhandbuch* [unter Verwendung von Arbeitsgruppen zur Kontrolle des Abfragezugriffs und der Kosten](https://docs.aws.amazon.com/athena/latest/ug/manage-queries-control-costs-with-workgroups.html).

Weitere Informationen zur Einrichtung von Arbeitsgruppen finden Sie [https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html](https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html) im *Athena-Benutzerhandbuch*.

**Anmerkung**  
Die Region, in der sich Ihr Amazon S3 S3-Bucket befindet, und die Athena-Konsole müssen übereinstimmen.

Bevor Sie eine Abfrage ausführen können, muss in Amazon S3 ein Speicherort für das Abfrageergebnis angegeben werden, oder Sie müssen eine Arbeitsgruppe verwenden, für die ein Bucket angegeben wurde und deren Konfiguration die Client-Einstellungen überschreibt. Ausgabedateien werden automatisch für jede Abfrage gespeichert, die ausgeführt wird.

Weitere Informationen zur Angabe von Speicherorten für Abfrageergebnisse in der Athena-Konsole finden Sie unter [Angeben eines Speicherorts für Abfrageergebnisse mithilfe der Athena-Konsole im Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/querying.html#query-results-specify-location-console) *Athena-Benutzerhandbuch*.

Beispiele für die Abfrage Ihres HealthLake Datenspeichers in Athena finden Sie unter[HealthLake Daten mit SQL abfragen](integrating-athena-query-sql.md).

# HealthLake Daten mit SQL abfragen
<a name="integrating-athena-query-sql"></a>

Wenn Sie Ihre FHIR-Daten in den HealthLake Datenspeicher importieren, werden die verschachtelten JSON-FHIR-Daten gleichzeitig einem ETL-Prozess unterzogen und im offenen Tabellenformat von Apache Iceberg in Amazon S3 gespeichert. Jeder FHIR-Ressourcentyp aus Ihrem HealthLake Datenspeicher wird in eine Tabelle konvertiert, in der er mit Amazon Athena abgefragt werden kann. Die Tabellen können einzeln oder als Gruppe mithilfe von SQL-basierten Abfragen abgefragt werden. Aufgrund der Struktur der Datenspeicher werden Ihre Daten als mehrere verschiedene Datentypen in Athena importiert. Weitere Informationen zum Erstellen von SQL-Abfragen, die auf diese Datentypen zugreifen können, finden Sie unter [Abfrage-Arrays mit komplexen Typen und verschachtelten Strukturen](https://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.html) im *Amazon Athena Athena-Benutzerhandbuch*.

**Anmerkung**  
Alle Beispiele in diesem Thema verwenden fiktionalisierte Daten, die mit Synthea erstellt wurden. Weitere Informationen zum Erstellen eines mit Synthea-Daten vorinstallierten Datenspeichers finden Sie unter. [Einen HealthLake Datenspeicher erstellen](managing-data-stores-create.md)

Für jedes Element in einem Ressourcentyp definiert die FHIR-Spezifikation eine Kardinalität. Die Kardinalität eines Elements definiert die Unter- und Obergrenzen, wie oft dieses Element vorkommen kann. Bei der Erstellung einer SQL-Abfrage müssen Sie dies berücksichtigen. Schauen wir uns zum Beispiel einige Elemente im [Ressourcentyp: Patient](https://hl7.org/fhir/R4/patient.html) an.
+ **Element: Name** Die FHIR-Spezifikation legt die Kardinalität als fest. `0..*`

  Das Element wird als Array erfasst.

  ```
  [{
  	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
  }]
  ```

  Um in Athena zu sehen, wie ein Ressourcentyp aufgenommen wurde, suchen Sie unter **Tabellen und** Ansichten danach. Um auf Elemente in diesem Array zuzugreifen, können Sie die Punktnotation verwenden. Hier ist ein einfaches Beispiel, das auf die Werte für `given` und zugreifen würde`family`.

  ```
  SELECT
      name[1].given as FirstName,
      name[1].family as LastName
  FROM Patient
  ```
+ **Element: MaritalStatus** Die FHIR-Spezifikation legt die Kardinalität als fest. `0..1`

  Dieses Element wird als JSON erfasst.

  ```
  {
  	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
  }
  ```

  Um in Athena zu sehen, wie ein Ressourcentyp aufgenommen wurde, suchen Sie unter **Tabellen und** Ansichten danach. Um auf Schlüssel-Wert-Paare im JSON zuzugreifen, können Sie die Punktnotation verwenden. Da es sich nicht um ein Array handelt, ist kein Array-Index erforderlich. Hier ist ein einfaches Beispiel, das auf den Wert für zugreifen würde`text`.

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

Weitere Informationen zum Zugreifen auf und Durchsuchen von JSON finden Sie unter [JSON abfragen](https://docs.aws.amazon.com//athena/latest/ug/querying-JSON.html) im *Athena-Benutzerhandbuch*.

Die Abfrageanweisungen der Athena Data Manipulation Language (DML) basieren auf Trino. Athena unterstützt nicht alle Funktionen von Trino, und es gibt *signifikante* Unterschiede. Weitere Informationen finden Sie unter [DML-Abfragen, Funktionen und Operatoren](https://docs.aws.amazon.com/athena/latest/ug/functions-operators-reference-section.html) im *Amazon Athena Athena-Benutzerhandbuch*.

Darüber hinaus unterstützt Athena mehrere Datentypen, auf die Sie bei der Erstellung von Abfragen Ihres HealthLake Datenspeichers stoßen können. Weitere Informationen zu Datentypen in Athena finden Sie unter [Datentypen in Amazon Athena im Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/data-types.html) *Athena-Benutzerhandbuch*.

Weitere Informationen zur Funktionsweise von SQL-Abfragen in Athena finden Sie unter [SQL-Referenz für Amazon Athena im Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/ddl-sql-reference.html) *Athena-Benutzerhandbuch*.

Jede Registerkarte zeigt Beispiele für die Suche nach den angegebenen Ressourcentypen und zugehörigen Elementen mit Athena.

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

Das Element `extension` wird verwendet, um benutzerdefinierte Felder in einem Datenspeicher zu erstellen.

Dieses Beispiel zeigt Ihnen, wie Sie auf die Funktionen des `extension` Elements zugreifen, das im `Patient` Ressourcentyp gefunden wurde.

Wenn Ihr HealthLake Datenspeicher in Athena importiert wird, werden die Elemente eines Ressourcentyps unterschiedlich analysiert. Da es sich bei der Struktur um `element` eine Variable handelt, kann sie im Schema nicht vollständig spezifiziert werden. Um diese Variabilität zu handhaben, werden die Elemente innerhalb des Arrays als Zeichenketten übergeben.

In der Tabellenbeschreibung von finden Sie das Element`Patient`, das als `extension` beschrieben wird`array<string>`, was bedeutet, dass Sie mithilfe eines Indexwerts auf die Elemente des Arrays zugreifen können. Um auf die Elemente der Zeichenfolge zuzugreifen, müssen Sie jedoch verwenden`json_extract`.

Hier ist ein einzelner Eintrag aus dem `extension` Element in der Patiententabelle.

```
[{
		"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"
	}
]
```

Obwohl dies gültiges JSON ist, behandelt Athena es als Zeichenfolge.

Dieses Beispiel für eine SQL-Abfrage zeigt, wie Sie eine Tabelle erstellen können, die die `patient-birthPlace` Elemente `patient-mothersMaidenName` und enthält. Um auf diese Elemente zuzugreifen, müssen Sie verschiedene Array-Indizes verwenden und `json_extract.`

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

Weitere Informationen zu Abfragen, die JSON beinhalten, finden Sie unter [Extrahieren von Daten aus JSON](https://docs.aws.amazon.com/athena/latest/ug/extracting-data-from-JSON.html) im *Amazon Athena Athena-Benutzerhandbuch*.

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

Alter ist *kein* Element des Ressourcentyps Patient in FHIR. Hier sind zwei Beispiele für Suchanfragen, die nach Alter filtern.

Da das Alter kein Element ist, verwenden wir das `birthDate` für die SQL-Abfragen. Um zu sehen, wie ein Element in FHIR aufgenommen wurde, suchen Sie unter **Tabellen und** Ansichten nach dem Tabellennamen. **Sie können sehen, dass es vom Typ Zeichenfolge ist.**

**Beispiel 1**: Berechnung eines Alterswerts

In dieser Beispiel-SQL-Abfrage verwenden wir ein integriertes SQL-Tool, `current_date` `year` um diese Komponenten zu extrahieren. Dann subtrahieren wir sie, um das tatsächliche Alter eines Patienten in einer Spalte mit dem Namen `age` zurückzugeben.

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

**Beispiel 2**: Filterung nach Patienten, die früher geboren wurden `2019-01-01` und es sind`male`.

Die SQL-Abfrage zeigt Ihnen, wie Sie die `CAST` Funktion verwenden, um das `birthDate` Element als Typ `DATE` umzuwandeln, und wie Sie anhand von zwei Kriterien in der `WHERE` Klausel filtern. Da das Element standardmäßig als **Typstring** aufgenommen wird, müssen wir `CAST` es als Typ eingeben`DATE`. Dann können Sie den `<` Operator verwenden, um es mit einem anderen Datum zu vergleichen. `2019-01-01` Mithilfe `AND` von können Sie der `WHERE` Klausel ein zweites Kriterium hinzufügen.

```
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 ]

Dieses Beispiel zeigt Suchen nach Orten innerhalb des Ressourcentyps Standort, bei denen der Stadtname Attleboro lautet.

```
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 ]

Der Ressourcentyp-Zustand speichert Diagnosedaten zu Problemen, die ein gewisses Maß an Besorgnis ausgelöst haben. HealthLakeDie integrierte medizinische Verarbeitung natürlicher Sprache (NLP) generiert *neue* `Condition` Ressourcen auf der Grundlage der im DocumentReference Ressourcentyp enthaltenen Angaben. Wenn neue Ressourcen generiert werden, wird das Tag HealthLake an das Element `SYSTEM_GENERATED` angehängt. `meta` Diese SQL-Beispielabfrage zeigt, wie Sie die Bedingungstabelle durchsuchen und Ergebnisse zurückgeben können, bei denen die `SYSTEM_GENERATED` Ergebnisse entfernt wurden.

Weitere Informationen HealthLake zur integrierten Verarbeitung natürlicher Sprache (NLP) finden Sie unter[Integrierte Verarbeitung natürlicher Sprache (NLP) für HealthLake](integrating-nlp.md).

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

Sie können auch innerhalb eines bestimmten Zeichenkettenelements suchen, um Ihre Anfrage weiter zu filtern. Das `modifierextension` Element enthält Details darüber, welche `DocumentReference` Ressource zum Generieren einer Reihe von Bedingungen verwendet wurde. Auch hier müssen Sie verwenden, `json_extract` um auf die verschachtelten JSON-Elemente zuzugreifen, die als Zeichenfolge in Athena importiert werden.

Diese SQL-Beispielabfrage zeigt, wie Sie nach all dem suchen können`Condition`, was auf der Grundlage einer bestimmten Abfrage generiert wurde. `DocumentReference` Verwenden Sie diese Option`CAST`, um das JSON-Element als Zeichenfolge festzulegen, sodass Sie `LIKE` es zum Vergleichen verwenden können.

```
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 ]

Der Ressourcentyp Observation speichert Messwerte und einfache Aussagen zu einem Patienten, einem Gerät oder einer anderen Person. HealthLakeDie integrierte Verarbeitung natürlicher Sprache (NLP) generiert *neue* `Observation` Ressourcen auf der Grundlage von Details, die in einer `DocumentReference` Ressource gefunden wurden. Diese SQL-Beispielabfrage enthält `WHERE meta.tag[1] is NULL` auskommentiert, was bedeutet, dass die `SYSTEM_GENERATED` Ergebnisse enthalten sind.

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

Diese Spalte wurde als importiert [https://iceberg.apache.org/spec/#schemas-and-data-types](https://iceberg.apache.org/spec/#schemas-and-data-types). Daher können Sie mithilfe der Punktnotation auf die darin enthaltenen Elemente zugreifen.

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

MedicationStatement ist ein FHIR-Ressourcentyp, mit dem Sie Informationen über Medikamente speichern können, die ein Patient eingenommen hat, einnimmt oder in future einnehmen wird. HealthLakeDie integrierte medizinische Verarbeitung natürlicher Sprache (NLP) generiert neue MedicationStatement Ressourcen auf der Grundlage von Dokumenten, die im DocumentReference Ressourcentyp gefunden wurden. Wenn neue Ressourcen generiert werden, wird das Tag HealthLake an das Element `SYSTEM_GENERATED` angehängt. `meta` Diese SQL-Beispielabfrage zeigt, wie eine Abfrage erstellt wird, die anhand eines einzelnen Patienten anhand seiner Kennung filtert und Ressourcen findet, die durch HealthLake das integrierte NLP hinzugefügt wurden.

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

Weitere Informationen HealthLake zur integrierten Verarbeitung natürlicher Sprache (NLP) finden Sie unter. [Integrierte Verarbeitung natürlicher Sprache (NLP) für HealthLake](integrating-nlp.md)

------

# Beispiel für SQL-Abfragen mit komplexer Filterung
<a name="integrating-athena-complex-filtering"></a>

Die folgenden Beispiele zeigen, wie Amazon Athena SQL-Abfragen mit komplexer Filterung verwendet werden, um FHIR-Daten aus einem HealthLake Datenspeicher zu finden.

**Example Erstellen Sie Filterkriterien auf der Grundlage demografischer Daten**  
Bei der Erstellung einer Patientenkohorte ist es wichtig, die richtigen demografischen Daten der Patienten zu ermitteln. Diese Beispielabfrage zeigt, wie Sie die Trino-Punktnotation verwenden und `json_extract` Daten in Ihrem HealthLake Datenspeicher filtern können.  

```
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;
```
Mit der Athena-Konsole können Sie die Ergebnisse weiter sortieren und herunterladen.

**Example Erstellen Sie Filter für einen Patienten und die damit verbundenen Erkrankungen**  
Die folgende Beispielabfrage zeigt, wie Sie alle verwandten Erkrankungen für die in einem HealthLake Datenspeicher gefundenen Patienten suchen und sortieren können.  

```
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;
```
Sie können die Athena-Konsole verwenden, um die Ergebnisse weiter zu sortieren oder sie zur weiteren Analyse herunterzuladen.

**Example Erstellen Sie Filter für Patienten und die damit verbundenen Beobachtungen**  
Die folgende Beispielabfrage zeigt, wie alle zugehörigen Beobachtungen für Patienten, die in einem HealthLake Datenspeicher gefunden wurden, gesucht und sortiert werden.  

```
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 Erstellen Sie Filterbedingungen für einen Patienten und die zugehörigen Verfahren**  
Die Verknüpfung von Verfahren mit Patienten ist ein wichtiger Aspekt des Gesundheitswesens. Die folgende SQL-Beispielabfrage zeigt, wie FHIR `Patient` und `Procedure` Ressourcentypen verwendet werden, um dies zu erreichen. Die folgende SQL-Abfrage gibt alle Patienten und die zugehörigen Verfahren zurück, die sich in Ihrem HealthLake Datenspeicher befinden.  

```
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;
```
Sie können die Athena-Konsole verwenden, um die Ergebnisse für weitere Analysen herunterzuladen oder sie zu sortieren, um die Ergebnisse besser zu verstehen.

**Example Erstellen Sie Filterbedingungen für einen Patienten und die zugehörigen Verschreibungen**  
Es ist wichtig, eine aktuelle Liste der Medikamente zu sehen, die Patienten einnehmen. Mit Athena können Sie eine SQL-Abfrage schreiben, die sowohl die Ressourcentypen als auch die `Patient` in Ihrem HealthLake Datenspeicher enthaltenen `MedicationRequest` Ressourcentypen verwendet.  
Die folgende SQL-Abfrage verknüpft die in Athena importierten `MedicationRequest` Tabellen `Patient` und. Außerdem werden die Rezepte mithilfe der Punktnotation in ihre einzelnen Einträge unterteilt.  

```
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
```
Sie können die Athena-Konsole verwenden, um die Ergebnisse zu sortieren oder sie zur weiteren Analyse herunterzuladen.

**Example Sehen Sie sich die im `MedicationStatement` Ressourcentyp gefundenen Medikamente an**  
Die folgende Beispielabfrage zeigt Ihnen, wie Sie das verschachtelte JSON organisieren, das mithilfe von SQL in Athena importiert wurde. Die Abfrage verwendet das `meta` FHIR-Element, um anzugeben, wann ein Medikament durch HealthLake die integrierte Verarbeitung natürlicher Sprache (NLP) hinzugefügt wurde. Es wird auch verwendet`json_extract`, um nach Daten innerhalb des Arrays von JSON-Zeichenketten zu suchen. Weitere Informationen finden Sie unter [Natürliche Sprachverarbeitung](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;
```
Sie können die Athena-Konsole verwenden, um diese Ergebnisse herunterzuladen oder zu sortieren.

**Example Filtern Sie nach einem bestimmten Krankheitstyp**  
Das Beispiel zeigt, wie Sie eine Gruppe von Patienten im Alter von 18 bis 75 Jahren finden können, bei denen Diabetes diagnostiziert wurde.  

```
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%');
```
Jetzt können Sie die Ergebnisse mit der Athena-Konsole sortieren oder zur weiteren Analyse herunterladen.