Ema Dash · SQL on FHIR, ejecutándose de verdad

SQL on FHIR es el estándar HL7 que convierte recursos FHIR en tablas planas sin ETL: la vista ES la consulta. Cada pestaña es un servicio real y cada panel una pregunta que ese servicio le hace a su dato, respondida por un ViewDefinition que usted puede leer, editar y ejecutar aquí mismo.

¿Quiénes son mis pacientes, con qué cobertura llegan, qué diagnósticos concentran la demanda y cuánta actividad registro?

Cargando el motor FHIRPath...

Cobertura previsional

El padrón por asegurador: la primera pregunta de cualquier área de finanzas, y la que normalmente vive en una planilla aparte.

Ver el ViewDefinition, el SQL y la tabla

El ViewDefinition detrás

Edítelo: los gráficos y la tabla se recalculan mientras escribe.

El SQL que representa

Ilustrativo: cada motor (Pathling, Aidbox, dbt sobre un warehouse FHIR) lo materializa en su dialecto. Lo que no cambia es que no hay un ETL en medio.

-- Un padrón con cobertura previsional por paciente
CREATE VIEW patient_coverage AS
SELECT
  coverage.beneficiary.getReferenceKey() AS patient_id,
  coverage.type.coding.display.first() AS coverage_type,
  coverage.payor.display.first() AS payor,
  coverage.status AS status
FROM coverage
WHERE status = 'active';

Tabla resultante0 filas

Ningún recurso produce filas con esta vista.

Carga de diagnósticos

CIE-10 por paciente, con el estado clínico al lado. La misma vista alimenta un registro de crónicos o un reporte a la autoridad sanitaria.

Ver el ViewDefinition, el SQL y la tabla

El ViewDefinition detrás

Edítelo: los gráficos y la tabla se recalculan mientras escribe.

El SQL que representa

Ilustrativo: cada motor (Pathling, Aidbox, dbt sobre un warehouse FHIR) lo materializa en su dialecto. Lo que no cambia es que no hay un ETL en medio.

-- Diagnósticos codificados en CIE-10 por paciente
CREATE VIEW condition_burden AS
SELECT
  condition.subject.getReferenceKey() AS patient_id,
  condition.clinicalStatus.coding.code.first() AS clinical_status,
  condition.recordedDate AS recorded_date,
  code.code AS icd10,
  code.display AS diagnosis
FROM condition
CROSS JOIN UNNEST(condition.code.coding.where(system = 'http://hl7.org/fhir/sid/icd-10')) AS code;

Tabla resultante0 filas

Ningún recurso produce filas con esta vista.

Actividad asistencial

Volumen por tipo de atención y por mes. El mes sale de un substring sobre la fecha del encuentro — la agregación temporal tampoco necesita un pipeline.

Ver el ViewDefinition, el SQL y la tabla

El ViewDefinition detrás

Edítelo: los gráficos y la tabla se recalculan mientras escribe.

El SQL que representa

Ilustrativo: cada motor (Pathling, Aidbox, dbt sobre un warehouse FHIR) lo materializa en su dialecto. Lo que no cambia es que no hay un ETL en medio.

-- Atenciones por tipo, modalidad y mes
CREATE VIEW encounter_activity AS
SELECT
  encounter.getResourceKey() AS encounter_id,
  encounter.subject.getReferenceKey() AS patient_id,
  encounter.class.display AS modality,
  encounter.type.coding.display.first() AS encounter_type,
  encounter.period.start.substring(0, 7) AS month,
  encounter.period.start AS started
FROM encounter
WHERE status = 'finished';

Tabla resultante0 filas

Ningún recurso produce filas con esta vista.

Sin esto, cada pregunta al dato clínico pasa por un pipeline que alguien construye, mantiene y arregla. Con esto, la pregunta se escribe una vez y corre sobre el dato tal como está almacenado.

Implementación de SQL on FHIR v2 en el navegador: column, forEach, forEachOrNull, select anidado, unionAll, where, constant, %resource, getResourceKey() y getReferenceKey(). No es un runner certificado — los bordes de colecciones y coerción de tipos están aproximados.

Especificación SQL on FHIR v2Las guías FHIR de EMA