

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Consulta de HealthLake datos con SQL
<a name="integrating-athena-query-sql"></a>

Al importar los datos del FHIR al almacén de HealthLake datos, los datos FHIR de JSON anidados se someten simultáneamente a un proceso de ETL y se almacenan en formato de tabla abierta Apache Iceberg en Amazon S3. Cada tipo de recurso FHIR del almacén de HealthLake datos se convierte en una tabla, donde se puede consultar mediante Amazon Athena. Las tablas se pueden consultar individualmente o en grupo mediante consultas basadas en SQL. Debido a la estructura de los almacenes de datos, los datos se importan a Athena como varios tipos de datos diferentes. Para obtener más información sobre la creación de consultas SQL que puedan acceder a estos tipos de datos, consulte [Matrices de consultas con tipos complejos y estructuras anidadas](https://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.html) en la Guía del usuario de *Amazon Athena*.

**nota**  
Todos los ejemplos de este tema utilizan datos ficticios creados con Synthea. Para obtener más información sobre cómo crear un banco de datos precargado con datos de Synthea, consulte. [Creación de un almacén HealthLake de datos](managing-data-stores-create.md)

Para cada elemento de un tipo de recurso, la especificación FHIR define una cardinalidad. La cardinalidad de un elemento define los límites inferior y superior del número de veces que puede aparecer este elemento. Al crear una consulta SQL, debe tener esto en cuenta. Por ejemplo, veamos algunos elementos de [Tipo de recurso: paciente](https://hl7.org/fhir/R4/patient.html).
+ **Elemento: nombre** La especificación del FHIR establece la cardinalidad como. `0..*`

  El elemento se captura como una matriz.

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

  En Athena, para ver cómo se ha ingerido un tipo de recurso, búsquelo en **Tablas** y vistas. Para acceder a los elementos de esta matriz, puede utilizar la notación de puntos. A continuación, se muestra un ejemplo sencillo que permite acceder a los valores de `given` y`family`.

  ```
  SELECT
      name[1].given as FirstName,
      name[1].family as LastName
  FROM Patient
  ```
+ **Elemento: MaritalStatus** La especificación del FHIR establece la cardinalidad como. `0..1`

  Este elemento se captura como 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
  }
  ```

  En Athena, para ver cómo se ha ingerido un tipo de recurso, búsquelo en **Tablas** y vistas. Para acceder a los pares clave-valor en el JSON, puede utilizar la notación de puntos. Como no es una matriz, no se requiere ningún índice de matriz. A continuación, se muestra un ejemplo sencillo con el que se accedería al valor de`text`.

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

Para obtener más información sobre cómo acceder y buscar en JSON, consulte [Consultas de JSON](https://docs.aws.amazon.com//athena/latest/ug/querying-JSON.html) en la Guía del usuario de *Athena*.

Las declaraciones de consulta del Lenguaje de Manipulación de Datos (DML) de Athena se basan en Trino. *Athena no es compatible con todas las funciones de Trino y existen diferencias significativas.* Para obtener más información, consulte [las consultas, las funciones y los operadores de DML](https://docs.aws.amazon.com/athena/latest/ug/functions-operators-reference-section.html) en la Guía del usuario de *Amazon Athena*.

Además, Athena admite varios tipos de datos que puede encontrar al crear consultas en su banco de HealthLake datos. Para obtener más información sobre los tipos de datos en Athena, consulte [Tipos de datos en Amazon Athena en](https://docs.aws.amazon.com/athena/latest/ug/data-types.html) la Guía del usuario de Amazon *Athena*.

Para obtener más información sobre cómo funcionan las consultas SQL en Athena, consulte la [referencia de SQL para Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/ddl-sql-reference.html) en la Guía del usuario de Amazon *Athena*.

Cada pestaña muestra ejemplos de cómo buscar en los tipos de recursos especificados y los elementos asociados con Athena.

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

El elemento `extension` se utiliza para crear campos personalizados en un banco de datos.

En este ejemplo, se muestra cómo acceder a las funciones del `extension` elemento que se encuentra en el tipo de `Patient` recurso.

Cuando el banco de HealthLake datos se importa a Athena, los elementos de un tipo de recurso se analizan de forma diferente. Como la estructura de `element` es variable, no se puede especificar completamente en el esquema. Para gestionar esa variabilidad, los elementos de la matriz se pasan como cadenas.

En la descripción de la tabla`Patient`, puede ver el elemento `extension` descrito como`array<string>`, lo que significa que puede acceder a los elementos de la matriz mediante un valor de índice. Sin embargo, para acceder a los elementos de la cadena, debe utilizar`json_extract`.

Esta es una única entrada del `extension` elemento que se encuentra en la tabla de pacientes.

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

Aunque se trata de un JSON válido, Athena lo trata como una cadena.

En este ejemplo de consulta SQL se muestra cómo se puede crear una tabla que contenga los `patient-birthPlace` elementos `patient-mothersMaidenName` y. Para acceder a estos elementos, debe utilizar diferentes índices de matriz y `json_extract.`

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

Para obtener más información sobre las consultas que implican JSON, consulte [Extracción de datos de JSON](https://docs.aws.amazon.com/athena/latest/ug/extracting-data-from-JSON.html) en la Guía del *usuario de Amazon Athena*.

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

La edad *no* es un elemento del tipo de recurso para pacientes en el FHIR. Estos son dos ejemplos de búsquedas que se filtran según la edad.

Como la edad no es un elemento, utilizamos la `birthDate` para las consultas SQL. Para ver cómo se ha incorporado un elemento al FHIR, busque el nombre de la tabla en **Tablas y vistas**. **Puede ver que es de tipo cadena.**

**Ejemplo 1**: Calcular un valor para la edad

En este ejemplo de consulta SQL, utilizamos una herramienta SQL integrada `year` para extraer esos componentes. `current_date` Luego, los restamos para obtener la edad real del paciente, como se llama `age` una columna.

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

**Ejemplo 2**: Filtrar los pacientes que nacieron antes `2019-01-01` y que lo son`male`.

La consulta SQL muestra cómo utilizar la `CAST` función para convertir el `birthDate` elemento en un tipo `DATE` y cómo filtrar en función de dos criterios de la `WHERE` cláusula. Como el elemento se ingiere como **cadena de texto** de forma predeterminada, debemos `CAST` incorporarlo como tipo`DATE`. Luego puede usar el `<` operador para compararlo con una fecha diferente,`2019-01-01`. Al usar`AND`, puede agregar un segundo criterio a la `WHERE` cláusula.

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

En este ejemplo, se muestran las búsquedas de ubicaciones dentro del tipo de recurso Ubicación donde el nombre de la ciudad es 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 condición del tipo de recurso almacena datos de diagnóstico relacionados con problemas que han llegado a ser preocupantes. HealthLakeEl procesamiento médico del lenguaje natural (PNL) integrado genera *nuevos* `Condition` recursos en función de los detalles que se encuentran en el tipo de DocumentReference recurso. Cuando se genera un nuevo recurso, HealthLake añade la etiqueta `SYSTEM_GENERATED` al `meta` elemento. En este ejemplo de consulta SQL se muestra cómo se puede buscar en la tabla de condiciones y devolver los `SYSTEM_GENERATED` resultados cuando se han eliminado.

Para obtener más información sobre HealthLake el procesamiento del lenguaje natural (NLP) integrado, consulte[Procesamiento de lenguaje natural (PNL) integrado para HealthLake](integrating-nlp.md).

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

También puede buscar dentro de un elemento de cadena específico para filtrar aún más la consulta. El `modifierextension` elemento contiene detalles sobre qué `DocumentReference` recurso se utilizó para generar un conjunto de condiciones. De nuevo, debe utilizarlos `json_extract` para acceder a los elementos JSON anidados que se traen a Athena como una cadena.

En este ejemplo de consulta SQL se muestra cómo buscar todo lo `Condition` que se ha generado a partir de una consulta específica. `DocumentReference` Se utiliza `CAST` para establecer el elemento JSON como una cadena que se puede utilizar `LIKE` para comparar.

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

El tipo de recurso, Observation, almacena las mediciones y las afirmaciones simples realizadas sobre un paciente, un dispositivo u otro tema. HealthLakeEl procesamiento del lenguaje natural (PNL) integrado genera *nuevos* `Observation` recursos en función de los detalles que se encuentran en un `DocumentReference` recurso. Este ejemplo de consulta SQL incluye `WHERE meta.tag[1] is NULL` comentarios, lo que significa que se incluyen los `SYSTEM_GENERATED` resultados.

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

Esta columna se importó como [https://iceberg.apache.org/spec/#schemas-and-data-types](https://iceberg.apache.org/spec/#schemas-and-data-types). Por lo tanto, puede acceder a los elementos que contiene mediante la notación de puntos.

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

MedicationStatement es un tipo de recurso del FHIR que puede utilizar para almacenar detalles sobre los medicamentos que un paciente ha tomado, está tomando o tomará en el futuro. HealthLakeEl procesamiento médico del lenguaje natural (PNL) integrado genera nuevos MedicationStatement recursos a partir de los documentos que se encuentran en ese tipo de DocumentReference recurso. Cuando se generan nuevos recursos, HealthLake añade la etiqueta `SYSTEM_GENERATED` al `meta` elemento. Este ejemplo de consulta SQL muestra cómo crear una consulta que filtre en función de un solo paciente mediante su identificador y busque los recursos que se han agregado mediante HealthLake la PNL integrada.

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

Para obtener más información sobre HealthLake el procesamiento del lenguaje natural (NLP) integrado, consulte. [Procesamiento de lenguaje natural (PNL) integrado para HealthLake](integrating-nlp.md)

------