

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 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).

------