

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Interrogation de HealthLake données avec Amazon Athena
<a name="integrating-athena"></a>

Au cours d'une tâche d' HealthLake importation, les données JSON FHIR imbriquées sont soumises à un processus ETL et sont stockées dans le [format de table ouverte Apache Iceberg](https://iceberg.apache.org/), où chaque type de ressource FHIR est représenté sous forme de table individuelle dans Athena. Cela permet aux utilisateurs d'interroger les données FHIR à l'aide de SQL, mais sans avoir à les exporter au préalable. Cela est utile, car cela permet aux cliniciens et aux scientifiques d'interroger les données du FHIR pour valider leurs décisions ou faire avancer leurs recherches. Pour plus d'informations sur le fonctionnement des tables Apache Iceberg dans Athena, [voir Interroger les tables Apache Iceberg](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg.html) dans le guide de l'utilisateur d'*Athena*.

**Note**  
HealthLake prend en charge l'`read`interaction FHIR R4 sur vos HealthLake données dans Athena. Pour de plus amples informations, veuillez consulter [Lire une ressource FHIR](managing-fhir-resources-read.md).

Les rubriques de cette section décrivent comment connecter votre banque de HealthLake données à Athena, comment l'interroger à l'aide de SQL et comment connecter les résultats à d'autres AWS services pour une analyse plus approfondie.

**Topics**
+ [Prise en main](integrating-athena-getting-started.md)
+ [Interrogation avec SQL](integrating-athena-query-sql.md)
+ [Exemples de requêtes](integrating-athena-complex-filtering.md)

# Commencer à utiliser Amazon Athena
<a name="integrating-athena-getting-started"></a>

Pour intégrer HealthLake Amazon Athena, vous devez configurer des autorisations. Pour ce faire, vous allez créer un utilisateur, un groupe ou un rôle Athena et lui accorder l'accès aux ressources FHIR situées dans un HealthLake magasin de données.
+ [Accorder à un utilisateur, un groupe ou un rôle l'accès à un magasin de HealthLake données (AWS Lake Formation Console)](#getting-started-athena-admin)
+ [Création d'un compte Athena](#getting-started-athena-user)

## Accorder à un utilisateur, un groupe ou un rôle l'accès à un magasin de HealthLake données (AWS Lake Formation Console)
<a name="getting-started-athena-admin"></a>

**Persona : administrator HealthLake**  
Le personnage d' HealthLake administrateur est un administrateur de lac de données dans AWS Lake Formation. Ils donnent accès aux magasins de HealthLake données de Lake Formation.

Pour chaque magasin de données créé, deux entrées sont visibles dans la console AWS Lake Formation. L'une des entrées est un *lien vers une ressource*. Les noms des liens vers les ressources sont toujours affichés en *italique.* Chaque lien de ressource est affiché avec le nom et le propriétaire de la ressource partagée associée. Pour tous les magasins de HealthLake données, le propriétaire de la ressource partagée est le compte HealthLake de service. L'autre entrée est le magasin HealthLake de données dans le compte HealthLake de service. Les étapes de cette procédure utilisent le magasin de données qui est le lien de ressource.

Pour en savoir plus sur les liens vers des ressources, voir [Comment fonctionnent les liens vers des ressources dans Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) in the *AWS Lake Formation Developer Guide*.

Pour qu'un utilisateur, un groupe ou un rôle puisse interroger des données dans Athena, vous devez accorder l'autorisation **Describe** sur la base de données de ressources. Ensuite, vous devez autoriser **Select** et **Describe** sur les tables.

**ÉTAPE 1 : Pour accorder des autorisations **DESCRIBE** sur une base de HealthLake données de liens de ressources**

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

1. Dans la barre de navigation principale, sélectionnez **Bases de données**.

1. Sur la page **Bases** de données, cliquez sur le bouton radio à côté du nom du magasin de données en italique.

1. Choisissez **Actions (▼)**.

1. Choisissez **Accorder**.

1. Sur la page **Accorder les autorisations relatives aux données**, sous **Principaux**, sélectionnez **Utilisateurs ou rôles IAM**.

1. Sous **Utilisateurs ou rôles IAM**, utilisez la **flèche vers le bas (▼)** ou recherchez l'utilisateur, le rôle ou le groupe IAM sur lequel vous souhaitez pouvoir effectuer des requêtes dans Athena.

1. Sous **Balises LF ou carte de ressources de catalogue**, choisissez l'option **Ressources de catalogue de données nommées**.

1. Sous **Bases de données**, utilisez la **flèche vers le bas (▼)** pour choisir la HealthLake base de données à laquelle vous souhaitez partager l'accès.

1. Dans la fiche d'autorisation **des liens vers les** **ressources, sous Autorisations des liens vers les** ressources, sélectionnez **Décrire**.

Lorsque l'autorisation est accordée, la bannière de **réussite de l'autorisation** apparaît. Pour consulter l'autorisation que vous venez d'accorder, choisissez **Data lake permissions**. Recherchez l'utilisateur, le groupe et le rôle dans le tableau. Sous la colonne **Autorisations**, vous verrez la liste **Décrire**.

Vous devez maintenant utiliser **Grant on target** pour autoriser **Select et **Describe**** sur toutes les tables de la base de données.

**ÉTAPE 2 : Accorder l'accès à toutes les tables d'un lien de ressource d'un magasin de HealthLake données**

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

1. Dans la barre de navigation principale, sélectionnez **Bases de données**.

1. Sur la page **Bases** de données, cliquez sur le bouton radio à côté du nom du magasin de données en italique.

1. Choisissez **Actions (▼)**.

1. Choisissez **Grant on target**.

1. Sur la page **Accorder les autorisations relatives aux données**, sous **Principaux**, sélectionnez **Utilisateurs ou rôles IAM**.

1. Sous **Utilisateurs ou rôles IAM**, utilisez la **flèche vers le bas (▼)** ou recherchez l'utilisateur, le groupe ou le rôle IAM sur lequel vous souhaitez pouvoir effectuer des requêtes dans Athena.

1. Sous **Balises LF ou carte de ressources de catalogue**, choisissez l'option **Ressources de catalogue de données nommées**.

1. Sous **Bases de données**, utilisez la **flèche vers le bas (▼)** pour choisir la HealthLake base de données à laquelle vous souhaitez accorder l'accès.

1. Sous **Tables**, choisissez **Toutes les tables** pour partager toutes les tables avec un HealthLake utilisateur.

1. Dans la fiche **Autorisations du tableau**, sous **Autorisations du tableau**, choisissez **Décrire** et **sélectionner**.

1. Choisissez **Accorder**.

Après avoir choisi l'octroi, une bannière de **réussite de l'octroi des autorisations** apparaît. L'utilisateur spécifié peut désormais effectuer des requêtes sur un magasin de HealthLake données dans Athena.

## Commencer à utiliser Athena
<a name="getting-started-athena-user"></a>

**HealthLake utilisateur**  
L' HealthLake utilisateur utilisera la console Athena ou AWS SDKs pour interroger un magasin de HealthLake données partagé avec lui par l' HealthLake administrateur. AWS CLI

Pour interroger un magasin de données à l'aide d'Athena, vous devez effectuer les trois opérations suivantes.
+ Accordez à l'utilisateur ou au rôle IAM l'accès au magasin de HealthLake données via Lake Formation. Pour en savoir plus, veuillez consulter la section [Accorder à un utilisateur, un groupe ou un rôle l'accès à un magasin de HealthLake données (AWS Lake Formation Console)](#getting-started-athena-admin).
+ Créez un groupe de travail pour votre banque HealthLake de données.
+ Désignez un compartiment Amazon S3 pour stocker les résultats de vos requêtes.

Pour commencer à utiliser Athena, ajoutez les politiques FullAccess AWS gérées **AmazonAthenaFullAccess**et **AmazonS3** à votre utilisateur, groupe ou rôle. L'utilisation d'une politique AWS gérée est un excellent moyen de commencer à utiliser un nouveau service. N'oubliez pas que les politiques gérées par AWS peuvent ne pas accorder d'autorisations de moindre privilège pour vos cas d'utilisation spécifiques, car elles sont disponibles pour tous les clients AWS. Lorsque vous définissez des autorisations avec des stratégies IAM, accordez uniquement les autorisations nécessaires à l'exécution d'une seule tâche. *Pour en savoir plus sur IAM et l'application du moindre privilège, consultez la section [Appliquer les autorisations du moindre privilège dans le Guide de l'utilisateur](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-use-aws-defined-policies) d'IAM.*

**Important**  
Pour interroger un magasin de HealthLake données dans Athena, vous devez utiliser le moteur **Athena version 3**.

Les groupes de travail sont des ressources. Vous pouvez donc utiliser des politiques basées sur l'IAM pour contrôler l'accès à des groupes de travail spécifiques. Pour en savoir plus, consultez la section [Utilisation de groupes de travail pour contrôler l'accès aux requêtes et les coûts](https://docs.aws.amazon.com/athena/latest/ug/manage-queries-control-costs-with-workgroups.html) dans le Guide de l'*utilisateur d'Athena*.

Pour en savoir plus sur la configuration des groupes de travail, consultez le guide [https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html](https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html) de l'utilisateur d'*Athena*.

**Note**  
La région dans laquelle se trouve votre compartiment Amazon S3 et la console Athena doivent correspondre.

Pour pouvoir exécuter une requête, vous devez spécifier un emplacement de compartiment de résultats de requête dans Simple Storage Service (Amazon S3) ou utiliser un groupe de travail qui a spécifié un compartiment et dont la configuration remplace les paramètres du client. Les fichiers de sortie sont enregistrés automatiquement pour chaque requête qui s'exécute.

*Pour plus de détails sur la spécification de l'emplacement des résultats de requête dans la console Athena, consultez la section [Spécification d'un emplacement de résultat de requête à l'aide de la console Athena](https://docs.aws.amazon.com/athena/latest/ug/querying.html#query-results-specify-location-console) dans le guide de l'utilisateur d'Amazon Athena.*

Pour voir des exemples illustrant la manière d'interroger votre HealthLake banque de données dans Athena, reportez-vous à. [Interrogation de HealthLake données avec SQL](integrating-athena-query-sql.md)

# Interrogation de HealthLake données avec SQL
<a name="integrating-athena-query-sql"></a>

Lorsque vous importez vos données FHIR dans le magasin de HealthLake données, les données FHIR JSON imbriquées sont simultanément soumises à un processus ETL et sont stockées au format de table ouverte Apache Iceberg dans Amazon S3. Chaque type de ressource FHIR de votre banque de HealthLake données est converti en table, dans laquelle il peut être interrogé à l'aide d'Amazon Athena. Les tables peuvent être interrogées individuellement ou en groupe à l'aide de requêtes SQL. En raison de la structure des magasins de données, vos données sont importées dans Athena sous la forme de plusieurs types de données différents. Pour en savoir plus sur la création de requêtes SQL pouvant accéder à ces types de données, consultez la section [Tableaux de requêtes dotés de types complexes et de structures imbriquées](https://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.html) dans le guide de l'utilisateur d'*Amazon Athena*.

**Note**  
Tous les exemples présentés dans cette rubrique utilisent des données fictives créées à l'aide de Synthea. Pour en savoir plus sur la création d'un magasin de données préchargé avec des données Synthea, consultez. [Création d'un magasin HealthLake de données](managing-data-stores-create.md)

Pour chaque élément d'un type de ressource, la spécification FHIR définit une cardinalité. La cardinalité d'un élément définit les limites inférieure et supérieure du nombre de fois que cet élément peut apparaître. Lorsque vous créez une requête SQL, vous devez en tenir compte. Par exemple, examinons certains éléments du champ [Type de ressource : Patient](https://hl7.org/fhir/R4/patient.html).
+ **Elément : Nom** La spécification FHIR définit la cardinalité comme. `0..*`

  L'élément est capturé sous forme de tableau.

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

  Dans Athena, pour savoir comment un type de ressource a été ingéré, recherchez-le sous **Tables** et vues. Pour accéder aux éléments de ce tableau, vous pouvez utiliser la notation par points. Voici un exemple simple qui permettrait d'accéder aux valeurs de `given` et`family`.

  ```
  SELECT
      name[1].given as FirstName,
      name[1].family as LastName
  FROM Patient
  ```
+ **Élément : MaritalStatus** La spécification FHIR définit la cardinalité comme. `0..1`

  Cet élément est capturé au format 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
  }
  ```

  Dans Athena, pour savoir comment un type de ressource a été ingéré, recherchez-le sous **Tables** et vues. Pour accéder aux paires clé-valeur dans le JSON, vous pouvez utiliser la notation par points. Comme il ne s'agit pas d'un tableau, aucun index de tableau n'est requis. Voici un exemple simple qui permettrait d'accéder à la valeur de`text`.

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

Pour en savoir plus sur l'accès au JSON et la recherche dans celui-ci, consultez la section [Interrogation de JSON](https://docs.aws.amazon.com//athena/latest/ug/querying-JSON.html) dans le guide de l'*utilisateur d'Athena*.

Les instructions de requête DML (Athena Data Manipulation Language) sont basées sur Trino. *Athena ne prend pas en charge toutes les fonctionnalités de Trino, et il existe des différences importantes.* Pour en savoir plus, consultez les [requêtes, fonctions et opérateurs DML](https://docs.aws.amazon.com/athena/latest/ug/functions-operators-reference-section.html) dans le guide de l'utilisateur *d'Amazon Athena*.

En outre, Athena prend en charge plusieurs types de données que vous pouvez rencontrer lors de la création de requêtes dans votre banque de HealthLake données. Pour en savoir plus sur les types de données dans Athena, consultez la section [Types de données dans Amazon Athena dans](https://docs.aws.amazon.com/athena/latest/ug/data-types.html) le guide de l'utilisateur d'Amazon *Athena*.

Pour en savoir plus sur le fonctionnement des requêtes SQL dans Athena, consultez la [référence SQL pour Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/ddl-sql-reference.html) dans le guide de l'utilisateur d'Amazon *Athena*.

Chaque onglet présente des exemples de recherche sur les types de ressources spécifiés et les éléments associés à l'aide d'Athena.

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

L'élément `extension` est utilisé pour créer des champs personnalisés dans un magasin de données.

Cet exemple montre comment accéder aux fonctionnalités de l'`extension`élément présent dans le type de `Patient` ressource.

Lorsque votre banque de HealthLake données est importée dans Athena, les éléments d'un type de ressource sont analysés différemment. Étant donné que la structure de la variable `element` is ne peut pas être entièrement spécifiée dans le schéma. Pour gérer cette variabilité, les éléments du tableau sont transmis sous forme de chaînes.

Dans la description du tableau de`Patient`, vous pouvez voir l'élément `extension` décrit comme`array<string>`, ce qui signifie que vous pouvez accéder aux éléments du tableau en utilisant une valeur d'index. Pour accéder aux éléments de la chaîne, vous devez toutefois utiliser`json_extract`.

Voici une seule entrée de l'`extension`élément trouvé dans le tableau des patients.

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

Même s'il s'agit d'un JSON valide, Athena le traite comme une chaîne.

Cet exemple de requête SQL montre comment créer une table contenant les `patient-birthPlace` éléments `patient-mothersMaidenName` et. Pour accéder à ces éléments, vous devez utiliser différents indices de tableau et `json_extract.`

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

Pour en savoir plus sur les requêtes impliquant du JSON, consultez la section [Extraction de données à partir de JSON](https://docs.aws.amazon.com/athena/latest/ug/extracting-data-from-JSON.html) dans le guide de l'*utilisateur Amazon Athena*.

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

L'âge *n'est pas* un élément du type de ressource patient dans le FHIR. Voici deux exemples de recherches filtrées en fonction de l'âge.

Comme l'âge n'est pas un élément, nous utilisons le `birthDate` pour les requêtes SQL. Pour voir comment un élément a été ingéré dans FHIR, recherchez le nom de la table sous **Tables et vues**. Vous pouvez voir qu'il est de type **chaîne**.

**Exemple 1** : Calcul d'une valeur pour l'âge

Dans cet exemple de requête SQL, nous utilisons un outil SQL intégré `year` pour extraire ces composants. `current_date` Ensuite, nous les soustrayons pour renvoyer l'âge réel du patient sous la forme d'une colonne appelée`age`.

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

**Exemple 2** : Filtrage pour les patients nés avant `2019-01-01` et ceux qui le sont`male`.

La requête SQL vous montre comment utiliser la `CAST` fonction pour convertir l'`birthDate`élément en type `DATE` et comment filtrer en fonction des deux critères de la `WHERE` clause. Étant donné que l'élément est ingéré en tant que **chaîne** de caractères par défaut, nous devons l'`CAST`ingérer en tant que type`DATE`. Ensuite, vous pouvez utiliser l'`<`opérateur pour le comparer à une autre date,`2019-01-01`. En utilisant`AND`, vous pouvez ajouter un deuxième critère à la `WHERE` clause.

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

Cet exemple montre les recherches de lieux dans le type de ressource Location dont le nom de ville est 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 ]

La condition du type de ressource stocke les données de diagnostic relatives à des problèmes devenus préoccupants. HealthLakele traitement médical intégré du langage naturel (NLP) génère de *nouvelles* `Condition` ressources en fonction des détails trouvés dans le type de DocumentReference ressource. Lorsque de nouvelles ressources sont générées, HealthLake ajoute la balise `SYSTEM_GENERATED` à l'`meta`élément. Cet exemple de requête SQL montre comment effectuer une recherche dans la table des conditions et renvoyer des résultats lorsque les `SYSTEM_GENERATED` résultats ont été supprimés.

Pour en savoir plus sur HealthLake le traitement automatique du langage naturel (NLP) intégré, consultez[Traitement du langage naturel (NLP) intégré pour HealthLake](integrating-nlp.md).

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

Vous pouvez également effectuer une recherche dans un élément de chaîne spécifique pour filtrer davantage votre requête. L'`modifierextension`élément contient des détails sur la `DocumentReference` ressource qui a été utilisée pour générer un ensemble de conditions. Encore une fois, vous devez utiliser `json_extract` pour accéder aux éléments JSON imbriqués qui sont introduits dans Athena sous forme de chaîne.

Cet exemple de requête SQL montre comment vous pouvez rechercher tout `Condition` ce qui a été généré en fonction d'un élément spécifique`DocumentReference`. `CAST`À utiliser pour définir l'élément JSON sous forme de chaîne afin de pouvoir l'utiliser `LIKE` pour comparer.

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

Le type de ressource Observation stocke les mesures et les assertions simples faites à propos d'un patient, d'un appareil ou d'un autre sujet. HealthLakele traitement du langage naturel (NLP) intégré génère de *nouvelles* `Observation` ressources en fonction des détails trouvés dans une `DocumentReference` ressource. Cet exemple de requête SQL inclut des `WHERE meta.tag[1] is NULL` commentaires, ce qui signifie que les `SYSTEM_GENERATED` résultats sont inclus.

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

Cette colonne a été importée en tant que [https://iceberg.apache.org/spec/#schemas-and-data-types](https://iceberg.apache.org/spec/#schemas-and-data-types). Par conséquent, vous pouvez accéder aux éléments qu'il contient en utilisant la notation par points.

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

MedicationStatement est un type de ressource FHIR que vous pouvez utiliser pour stocker des informations sur les médicaments qu'un patient a pris, prend ou prendra à l'avenir. HealthLakele traitement médical intégré du langage naturel (NLP) génère de nouvelles MedicationStatement ressources sur la base des documents trouvés dans le type de DocumentReference ressource. Lorsque de nouvelles ressources sont générées, HealthLake ajoute la balise `SYSTEM_GENERATED` à l'`meta`élément. Cet exemple de requête SQL montre comment créer une requête filtrant en fonction d'un seul patient à l'aide de son identifiant et recherchant les ressources ajoutées par HealthLake le NLP intégré.

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

Pour en savoir plus sur HealthLake le traitement automatique du langage naturel (NLP) intégré, consultez[Traitement du langage naturel (NLP) intégré pour HealthLake](integrating-nlp.md).

------

# Exemples de requêtes SQL avec filtrage complexe
<a name="integrating-athena-complex-filtering"></a>

Les exemples suivants montrent comment utiliser les requêtes SQL Amazon Athena avec un filtrage complexe pour localiser les données FHIR depuis un HealthLake magasin de données.

**Example Créez des critères de filtrage basés sur les données démographiques**  
Il est important d'identifier les données démographiques correctes lors de la création d'une cohorte de patients. Cet exemple de requête montre comment utiliser la notation par points Trino et `json_extract` comment filtrer les données dans votre banque de HealthLake données.  

```
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;
```
À l'aide de la console Athena, vous pouvez mieux trier et télécharger les résultats.

**Example Créez des filtres pour un patient et ses affections associées**  
L'exemple de requête suivant montre comment vous pouvez rechercher et trier toutes les affections associées aux patients trouvés dans une banque de HealthLake données.  

```
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;
```
Vous pouvez utiliser la console Athena pour trier davantage les résultats ou les télécharger pour une analyse plus approfondie.

**Example Créez des filtres pour les patients et leurs observations associées**  
L'exemple de requête suivant montre comment rechercher et trier toutes les observations associées relatives aux patients trouvées dans un magasin de HealthLake données.  

```
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 Créez des conditions de filtrage pour un patient et les procédures associées**  
Connecter les procédures aux patients est un aspect important des soins de santé. L'exemple de requête SQL suivant montre comment utiliser FHIR `Patient` et les types de `Procedure` ressources pour y parvenir. La requête SQL suivante renverra tous les patients et les procédures associées trouvés dans votre banque de HealthLake données.  

```
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;
```
Vous pouvez utiliser la console Athena pour télécharger les résultats en vue d'une analyse plus approfondie ou pour les trier afin de mieux comprendre les résultats.

**Example Créez des conditions de filtrage pour un patient et ses prescriptions associées**  
Il est important de consulter la liste à jour des médicaments que les patients prennent. À l'aide d'Athena, vous pouvez écrire une requête SQL qui utilise à la fois les types de `MedicationRequest` ressources `Patient` et les types de ressources présents dans votre banque de HealthLake données.  
La requête SQL suivante joint les `MedicationRequest` tables `Patient` et importées dans Athena. Il organise également les prescriptions en entrées individuelles à l'aide de la notation par points.  

```
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
```
Vous pouvez utiliser la console Athena pour trier les résultats ou les télécharger pour une analyse plus approfondie.

**Example Voir les médicaments trouvés dans le type de `MedicationStatement` ressource**  
L'exemple de requête suivant vous montre comment organiser le JSON imbriqué importé dans Athena à l'aide de SQL. La requête utilise l'`meta`élément FHIR pour indiquer quand un médicament a été ajouté par le traitement HealthLake du langage naturel (NLP) intégré. Il est également utilisé `json_extract` pour rechercher des données dans le tableau de chaînes JSON. Pour de plus amples informations, veuillez consulter [Traitement du langage naturel](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;
```
Vous pouvez utiliser la console Athena pour télécharger ces résultats ou les trier.

**Example Filtre pour un type de maladie spécifique**  
L'exemple montre comment vous pouvez trouver un groupe de patients âgés de 18 à 75 ans chez qui on a diagnostiqué un diabète.  

```
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%');
```
Vous pouvez désormais utiliser la console Athena pour trier les résultats ou les télécharger pour une analyse plus approfondie.