

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 Amazon Athena
<a name="integrating-athena"></a>

Durante un trabajo de HealthLake importación, los datos JSON anidados del FHIR se someten a un proceso ETL y se almacenan en el [formato de tabla abierta Apache Iceberg](https://iceberg.apache.org/), donde cada tipo de recurso del FHIR se representa como una tabla individual en Athena. Esto permite a los usuarios consultar los datos del FHIR mediante SQL, pero sin tener que exportarlos primero. Esto es valioso, ya que permite a los médicos y científicos consultar los datos del FHIR para validar sus decisiones o avanzar en sus investigaciones. Para obtener más información sobre el funcionamiento de las tablas de Iceberg de Apache en Athena, [consulte Consulte las tablas de Apache Iceberg](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg.html) en la Guía del usuario de *Athena*.

**nota**  
HealthLake admite la `read` interacción FHIR R4 con sus HealthLake datos en Athena. Para obtener más información, consulte [Lectura de un recurso del FHIR](managing-fhir-resources-read.md).

En los temas de esta sección se describe cómo conectar el HealthLake banco de datos a Athena, cómo consultarlo mediante SQL y cómo conectar los resultados con otros AWS servicios para su posterior análisis.

**Topics**
+ [Introducción](integrating-athena-getting-started.md)
+ [Consultas con SQL](integrating-athena-query-sql.md)
+ [Consultas de ejemplo](integrating-athena-complex-filtering.md)

# Cómo empezar a usar Amazon Athena
<a name="integrating-athena-getting-started"></a>

Para integrarse HealthLake con Amazon Athena, debe configurar los permisos. Para ello, creará un usuario, grupo o rol de Athena y le concederá acceso a los recursos del FHIR ubicados en un HealthLake almacén de datos.
+ [Otorgar a un usuario, grupo o rol acceso a un almacén de HealthLake datos (AWS Lake Formation Console)](#getting-started-athena-admin)
+ [Configuración de una cuenta de Athena](#getting-started-athena-user)

## Otorgar a un usuario, grupo o rol acceso a un almacén de HealthLake datos (AWS Lake Formation Console)
<a name="getting-started-athena-admin"></a>

**Persona: HealthLake administrador**  
La persona HealthLake administradora es un administrador de un lago de datos en AWS Lake Formation. Permiten el acceso a HealthLake los almacenes de datos en Lake Formation.

Para cada banco de datos creado, hay dos entradas visibles en la consola de AWS Lake Formation. Una entrada es un *enlace a un recurso*. Los nombres de los enlaces de recursos siempre se muestran en *cursiva.* Cada enlace a un recurso se muestra con el nombre y el propietario del recurso compartido vinculado. En todos los almacenes de HealthLake datos, el propietario del recurso compartido es la cuenta HealthLake de servicio. La otra entrada es el almacén HealthLake de datos de la cuenta HealthLake de servicio. En los pasos de este procedimiento se utiliza el banco de datos que es el enlace de recursos.

Para obtener más información sobre los enlaces de recursos, consulte [Cómo funcionan los enlaces de recursos en Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) en la *Guía para desarrolladores de AWS Lake Formation*.

Para que un usuario, grupo o rol pueda consultar datos en Athena, debe conceder el permiso **Describe** en la base de datos de recursos. A continuación, debe conceder las opciones **Seleccionar** y **Describir** en las tablas.

**PASO 1: Otorgar los permisos **DESCRIBE** en una base de HealthLake datos de enlaces a recursos del almacén de datos**

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

1. En la barra de navegación principal, selecciona **Bases de datos**.

1. En la página **Bases** de datos, pulse el botón de opción situado junto al nombre del banco de datos que aparece en cursiva.

1. Elija **Acciones (▼).**

1. Elija **Conceder**.

1. En la página **Otorgar permisos de datos**, en **Directores,** selecciona **usuarios o roles de IAM**.

1. En **Usuarios o roles de IAM**, utilice la **flecha hacia abajo (▼)** o busque el usuario, rol o grupo de IAM sobre el que desee realizar consultas en Athena.

1. En las **etiquetas LF o en la tarjeta de recursos del catálogo, seleccione la opción Recursos** del catálogo de datos con **nombre asignado**.

1. En **Bases de datos**, utilice la **flecha hacia abajo (▼)** para elegir la base de HealthLake datos del almacén de datos a la que desea compartir el acceso.

1. En la tarjeta **de permisos de enlace** de recursos, en **Permisos de enlace de recursos**, elija **Describir**.

Cuando la concesión se haya concedido correctamente, aparecerá el aviso de **autorización de concesión** correcta. Para ver el permiso que acabas de conceder, selecciona **Permisos de Data Lake**. Busque el usuario, el grupo y el rol en la tabla. En la columna **Permisos**, verá la lista **Describe**.

Ahora debe usar **Grant on target** para conceder las opciones **Seleccionar** y **Describir** en todas las tablas de la base de datos.

**PASO 2: Otorgue acceso a todas las tablas de un enlace de recursos del almacén de HealthLake datos**

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

1. En la barra de navegación principal, selecciona **Bases de datos**.

1. En la página **Bases** de datos, pulse el botón de opción situado junto al nombre del banco de datos que aparece en cursiva.

1. Elija **Acciones (▼).**

1. Elige **Subvencionar según el objetivo**.

1. En la página **Otorgar permisos de datos**, en **Directores,** selecciona **usuarios o roles de IAM**.

1. En **Usuarios o roles de IAM**, utilice la **flecha hacia abajo (▼)** o busque el usuario, grupo o rol de IAM sobre el que desee realizar consultas en Athena.

1. En las **etiquetas LF o en la tarjeta de recursos del catálogo, seleccione la opción Recursos** del catálogo de datos con **nombre asignado**.

1. En **Bases de datos**, utilice la **flecha hacia abajo (▼)** para elegir la base de HealthLake datos del almacén de datos a la que desea conceder acceso.

1. En **Tablas**, elija **Todas las tablas** para compartir todas las tablas con un HealthLake usuario.

1. En la tarjeta de **permisos de tabla**, en **Permisos de tabla**, elija **Describir** y **seleccionar**.

1. Elija **Conceder**.

Tras seleccionar la concesión, aparece un aviso de autorización de **autorización de concesión de permisos**. El usuario especificado ahora puede realizar consultas en un almacén de HealthLake datos de Athena.

## Cómo empezar con Athena
<a name="getting-started-athena-user"></a>

**HealthLake usuario**  
El HealthLake usuario utilizará la consola de Athena o AWS SDKs consultará un almacén de HealthLake datos compartido con él por el HealthLake administrador. AWS CLI

Para consultar un banco de datos con Athena, debe hacer las tres cosas siguientes.
+ Conceda al usuario o rol de IAM acceso al almacén de HealthLake datos a través de Lake Formation. Para obtener más información, consulte [Otorgar a un usuario, grupo o rol acceso a un almacén de HealthLake datos (AWS Lake Formation Console)](#getting-started-athena-admin).
+ Cree un grupo de trabajo para su almacén de HealthLake datos.
+ Designe un bucket de Amazon S3 para almacenar los resultados de las consultas.

Para empezar a utilizar Athena, añada las políticas gestionadas por Amazon S3 **AmazonAthenaFullAccess**y las políticas FullAccess AWS gestionadas por **Amazon S3** a su usuario, grupo o función. El uso de una política AWS administrada es una excelente forma de empezar a utilizar un nuevo servicio. Tenga en cuenta que es posible que las políticas administradas por AWS no otorguen permisos de privilegios mínimos para sus casos de uso específicos, ya que están disponibles para que los usen todos los clientes de AWS. Cuando establezca permisos con políticas de IAM, conceda solo los permisos necesarios para llevar a cabo una tarea. *Para obtener más información sobre la IAM y la aplicación de los privilegios mínimos, consulte [Aplicar](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-use-aws-defined-policies) los permisos con los privilegios mínimos en la Guía del usuario de IAM.*

**importante**  
Para consultar un banco HealthLake de datos en Athena, debe utilizar la versión 3 del motor **Athena**.

Los grupos de trabajo son recursos y, por lo tanto, puede utilizar políticas basadas en la IAM para controlar el acceso a grupos de trabajo específicos. Para obtener más información, consulte [Uso de grupos de trabajo para controlar el acceso y los costos de las consultas](https://docs.aws.amazon.com/athena/latest/ug/manage-queries-control-costs-with-workgroups.html) en la Guía del usuario de *Athena*.

Para obtener más información sobre la configuración de grupos de trabajo, consulte la [https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html](https://docs.aws.amazon.com/athena/latest/ug/workgroups-procedure.html) Guía del usuario de *Athena*.

**nota**  
La región en la que se encuentra su bucket de Amazon S3 y la consola Athena deben coincidir.

Antes de poder ejecutar una consulta, se debe especificar una ubicación de bucket de resultado de consulta en Amazon S3 o debe utilizar un grupo de trabajo que tenga especificado un bucket y cuya configuración sobrescriba la configuración del cliente. Los archivos de salida se guardan automáticamente por cada consulta que se hace.

*Para obtener más información sobre cómo especificar las ubicaciones de los resultados de las consultas en la consola de Athena, consulte [Especificar una ubicación de resultados de consulta mediante la consola de Athena](https://docs.aws.amazon.com/athena/latest/ug/querying.html#query-results-specify-location-console) en la Guía del usuario de Amazon Athena.*

Para ver ejemplos de cómo consultar el banco de HealthLake datos en Athena, consulte. [Consulta de HealthLake datos con SQL](integrating-athena-query-sql.md)

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

------

# Ejemplos de consultas SQL con filtrado complejo
<a name="integrating-athena-complex-filtering"></a>

Los siguientes ejemplos muestran cómo utilizar las consultas SQL de Amazon Athena con filtrado complejo para localizar los datos del FHIR de un HealthLake almacén de datos.

**Example Cree criterios de filtrado basados en datos demográficos**  
Es importante identificar los datos demográficos correctos de los pacientes a la hora de crear una cohorte de pacientes. Este ejemplo de consulta demuestra cómo puede utilizar la notación de puntos de Trino y filtrar `json_extract` los datos del banco de HealthLake datos.  

```
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;
```
Con la consola Athena, puede ordenar y descargar aún más los resultados.

**Example Cree filtros para un paciente y sus afecciones relacionadas**  
La siguiente consulta de ejemplo muestra cómo encontrar y ordenar todas las afecciones relacionadas con los pacientes que se encuentran en un banco de HealthLake datos.  

```
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;
```
Puede utilizar la consola Athena para ordenar aún más los resultados o descargarlos para analizarlos más a fondo.

**Example Cree filtros para los pacientes y sus observaciones relacionadas**  
La siguiente consulta de ejemplo muestra cómo buscar y ordenar todas las observaciones relacionadas de los pacientes que se encuentran en un HealthLake banco de datos.  

```
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 Cree condiciones de filtrado para un paciente y sus procedimientos relacionados**  
Conectar los procedimientos con los pacientes es un aspecto importante de la atención médica. La siguiente consulta de ejemplo de SQL muestra cómo utilizar el FHIR `Patient` y `Procedure` los tipos de recursos para lograrlo. La siguiente consulta SQL devolverá todos los pacientes y sus procedimientos relacionados que se encuentran en el almacén de HealthLake datos.  

```
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;
```
Puede utilizar la consola Athena para descargar los resultados para analizarlos más a fondo o ordenarlos para comprenderlos mejor.

**Example Cree condiciones de filtrado para un paciente y sus recetas relacionadas**  
Es importante ver una lista actualizada de los medicamentos que toman los pacientes. Con Athena, puede escribir una consulta SQL que utilice tanto los tipos de `MedicationRequest` recursos como los `Patient` que se encuentran en su almacén de HealthLake datos.  
La siguiente consulta SQL une las `MedicationRequest` tablas `Patient` y importadas a Athena. También organiza las recetas en sus entradas individuales mediante la notación de puntos.  

```
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
```
Puede utilizar la consola Athena para ordenar los resultados o descargarlos para analizarlos más a fondo.

**Example Consulte los medicamentos que se encuentran en el tipo de `MedicationStatement` recurso**  
La siguiente consulta de ejemplo muestra cómo organizar el JSON anidado importado a Athena mediante SQL. La consulta utiliza el `meta` elemento FHIR para indicar cuándo se ha agregado un medicamento mediante el procesamiento HealthLake del lenguaje natural (PNL) integrado. También se utiliza `json_extract` para buscar datos dentro de la matriz de cadenas JSON. Para obtener más información, consulte [Procesamiento de lenguaje natural](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;
```
Puede utilizar la consola de Athena para descargar estos resultados u ordenarlos.

**Example Filtra por un tipo de enfermedad específico**  
El ejemplo muestra cómo encontrar un grupo de pacientes de entre 18 y 75 años a los que se les haya diagnosticado diabetes.  

```
SELECT patient.id as patientId,
	condition.id as conditionId,
	CONCAT(name [ 1 ].family, ' ', name [ 1 ].given [ 1 ]) as name,
	(year(current_date) - year(date(birthdate))) AS age,
	CASE
		WHEN condition.encounter.reference IS NOT NULL THEN condition.encounter.reference
		WHEN observation.encounter.reference IS NOT NULL THEN observation.encounter.reference
	END as encounterId,
	CASE
		WHEN condition.encounter.type IS NOT NULL THEN observation.encounter.type
		WHEN observation.encounter.type IS NOT NULL THEN observation.encounter.type
	END AS encountertype,
	condition.code.coding [ 1 ].code as diagnosisCode,
	condition.code.coding [ 1 ].display as diagnosisDescription,
	observation.category [ 1 ].coding [ 1 ].code as categoryCode,
	observation.category [ 1 ].coding [ 1 ].display as categoryDescription,
	observation.code.coding [ 1 ].code as observationCode,
	observation.code.coding [ 1 ].display as observationDescription,
	effectivedatetime AS observationDateTime,
	CASE
      WHEN valuequantity.value IS NOT NULL THEN CONCAT(CAST(valuequantity.value AS VARCHAR),' ',valuequantity.unit)
      WHEN valueCodeableConcept.coding [ 1 ].code IS NOT NULL THEN CAST(valueCodeableConcept.coding [ 1 ].code AS VARCHAR)
      WHEN valuestring IS NOT NULL THEN CAST(valuestring AS VARCHAR)
      WHEN valueboolean IS NOT NULL THEN CAST(valueboolean AS VARCHAR)
      WHEN valueinteger IS NOT NULL THEN CAST(valueinteger AS VARCHAR)
      WHEN valueratio IS NOT NULL THEN CONCAT(CAST(valueratio.numerator.value AS VARCHAR),'/',CAST(valueratio.denominator.value AS VARCHAR))
      WHEN valuerange IS NOT NULL THEN CONCAT(CAST(valuerange.low.value AS VARCHAR),'-',CAST(valuerange.high.value AS VARCHAR))
      WHEN valueSampledData IS NOT NULL THEN CAST(valueSampledData.data AS VARCHAR)
      WHEN valueTime IS NOT NULL THEN CAST(valueTime AS VARCHAR)
      WHEN valueDateTime IS NOT NULL THEN CAST(valueDateTime AS VARCHAR)
      WHEN valuePeriod IS NOT NULL THEN valuePeriod.start
      WHEN component[1] IS NOT NULL THEN CONCAT(CAST(component[2].valuequantity.value AS VARCHAR),' ',CAST(component[2].valuequantity.unit AS VARCHAR), '/', CAST(component[1].valuequantity.value AS VARCHAR),' ',CAST(component[1].valuequantity.unit AS VARCHAR))
    END AS observationvalue,
	CASE
		WHEN condition.meta.tag [ 1 ].display = 'SYSTEM GENERATED' THEN 'YES'
		WHEN condition.meta.tag [ 1 ].display IS NULL THEN 'NO'
		WHEN observation.meta.tag [ 1 ].display = 'SYSTEM GENERATED' THEN 'YES'
		WHEN observation.meta.tag [ 1 ].display IS NULL THEN 'NO'
  	END AS IsSystemGenerated,
  CAST(
    json_extract(
      condition.modifierextension [ 1 ],
      '$.valueDecimal'
    ) AS int
  ) AS confidenceScore
FROM database.patient,
	database.condition,
	database.observation
WHERE CONCAT('Patient/', patient.id) = condition.subject.reference
	AND CONCAT('Patient/', patient.id) = observation.subject.reference
  	AND (year(current_date) - year(date(birthdate))) >= 18
  	AND (year(current_date) - year(date(birthdate))) <= 75
  	AND condition.code.coding [ 1 ].display like ('%diabetes%');
```
Ahora puede usar la consola Athena para ordenar los resultados o descargarlos para analizarlos más a fondo.