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...El padrón por asegurador: la primera pregunta de cualquier área de finanzas, y la que normalmente vive en una planilla aparte.
Edítelo: los gráficos y la tabla se recalculan mientras escribe.
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';
Ningún recurso produce filas con esta vista.
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.
Edítelo: los gráficos y la tabla se recalculan mientras escribe.
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;
Ningún recurso produce filas con esta vista.
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.
Edítelo: los gráficos y la tabla se recalculan mientras escribe.
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';
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.