From 4a2dbb549bf51061f2ca4090fe65ae4513087022 Mon Sep 17 00:00:00 2001 From: ThiagoTrabach Date: Wed, 28 Aug 2024 15:27:46 -0300 Subject: [PATCH] Fix after merge issues to build episodio assistencial --- ..._historico_clinico__episodio__vitacare.sql | 3 +- ...int_historico_clinico__episodio__vitai.sql | 66 +++++--- .../_mart_historico_clinico_schema.yml | 3 - .../mart_historico_clinico__episodio.sql | 151 +++--------------- .../raw_prontuario_vitai__exame.sql | 2 +- 5 files changed, 61 insertions(+), 164 deletions(-) diff --git a/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitacare.sql b/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitacare.sql index f43d41f5..2af60d56 100644 --- a/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitacare.sql +++ b/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitacare.sql @@ -21,7 +21,6 @@ with select cpf as pk, struct( - prontuario.id_paciente as id, paciente_merged.cpf, paciente_merged.cns, paciente_merged.dados.data_nascimento @@ -159,7 +158,7 @@ with dim_estabelecimento.estabelecimento, -- Profissional - ARRAY( + ( SELECT AS STRUCT dim_profissional.id as id, dim_profissional.cpf as cpf, diff --git a/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitai.sql b/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitai.sql index c8806650..1fc3c458 100644 --- a/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitai.sql +++ b/models/intermediate/historico_clinico/episodio/int_historico_clinico__episodio__vitai.sql @@ -5,33 +5,45 @@ materialized="table", ) }} --- Cria tabela padronizada da entidade episodio assistencial da vitai with - -- Traz boletins com chaves de paciente tratadas + paciente_mrg as ( + select + id_paciente, + cpf, + cns, + dados.data_nascimento + from {{ ref('mart_historico_clinico__paciente') }} as paciente_merged, + unnest(prontuario) as prontuario + where sistema = 'VITAI' + ), boletim as ( select - gid, - gid_paciente, - gid_estabelecimento, - atendimento_tipo, - especialidade_nome, + b.gid, + b.gid_paciente, + b.gid_estabelecimento, + b.atendimento_tipo, + b.especialidade_nome, case - when {{process_null('internacao_data')}} is null then null - else cast(internacao_data as datetime) + when {{process_null('b.internacao_data')}} is null then null + else cast(b.internacao_data as datetime) end as internacao_data, - {{clean_numeric('cns')}} as cns, - {{clean_numeric('cpf')}} as cpf, - imported_at, - updated_at, + b.imported_at, + b.updated_at, case - when {{process_null('data_entrada')}} is null then null - else cast(data_entrada as datetime) + when {{process_null('b.data_entrada')}} is null then null + else cast(b.data_entrada as datetime) end as entrada_datahora, case - when {{process_null('alta_data')}} is null then null - else cast(alta_data as datetime) + when {{process_null('b.alta_data')}} is null then null + else cast(b.alta_data as datetime) end as saida_datahora, - from {{ ref("raw_prontuario_vitai__boletim") }} + IF({{clean_numeric('b.cpf')}} is null, + paciente_mrg.cpf, + {{clean_numeric('b.cpf')}}) as cpf, + paciente_mrg.cns as cns, + paciente_mrg.data_nascimento + from {{ ref("raw_prontuario_vitai__boletim") }} as b + left join paciente_mrg on b.gid_paciente = paciente_mrg.id_paciente ), consulta as ( select @@ -122,12 +134,13 @@ with atendimento_tipo, especialidade_nome, internacao_data, - cns, - cpf, imported_at, updated_at, entrada_datahora, saida_datahora, + cpf, + cns, + data_nascimento, tipo, gid_profissional, cid_codigo, @@ -142,7 +155,7 @@ with ) ) as exames_realizados from exame_dupl - group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 + group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 ), episodios as ( select * @@ -178,7 +191,7 @@ with from queixa_all where ordenacao = 1 ), - -- Desfecho do atendimento + -- Desfecho do atendimento desfecho_atendimento_all as ( select gid_boletim, @@ -270,7 +283,7 @@ with desfecho_atendimento_final.desfecho, episodios_distinct.entrada_datahora, episodios_distinct.saida_datahora, - struct(episodios_distinct.gid as id_prontuario, episodios_distinct.cpf, episodios_distinct.cns) as paciente, + struct(episodios_distinct.cpf, episodios_distinct.cns,episodios_distinct.data_nascimento) as paciente, struct( profissional_distinct.profissional_id as id, profissional_distinct.profissional_cpf as cpf, @@ -301,7 +314,8 @@ with imported_at, updated_at, cpf, - cns + cns, + data_nascimento from episodios ) as episodios_distinct left join estabelecimentos on episodios_distinct.gid_estabelecimento = estabelecimentos.gid @@ -313,7 +327,7 @@ with ) select -- Paciente - paciente_struct.paciente, + atendimento_struct.paciente, -- Tipo e Subtipo safe_cast(atendimento_struct.tipo as string) as tipo, @@ -343,7 +357,7 @@ with -- Metadados struct( safe_cast(updated_at as datetime) as updated_at, - safe_cast(imported_at as datetime) as loaded_at, + safe_cast(imported_at as datetime) as imported_at, safe_cast(current_datetime() as datetime) as processed_at ) as metadados from atendimento_struct diff --git a/models/marts/historico_clinico/_mart_historico_clinico_schema.yml b/models/marts/historico_clinico/_mart_historico_clinico_schema.yml index fbe8b0a3..13e9d702 100644 --- a/models/marts/historico_clinico/_mart_historico_clinico_schema.yml +++ b/models/marts/historico_clinico/_mart_historico_clinico_schema.yml @@ -155,9 +155,6 @@ models: - name: metadados description: | Metadados do registro - - name: metadados.imported_at - description: | - Data de importação para o datalake - name: metadados.updated_at description: | Data de última atualização. diff --git a/models/marts/historico_clinico/mart_historico_clinico__episodio.sql b/models/marts/historico_clinico/mart_historico_clinico__episodio.sql index 4cd23d2a..981dea0c 100644 --- a/models/marts/historico_clinico/mart_historico_clinico__episodio.sql +++ b/models/marts/historico_clinico/mart_historico_clinico__episodio.sql @@ -3,177 +3,64 @@ schema="saude_historico_clinico", alias="episodio_assistencial", materialized="table", - cluster_by="paciente_cpf", + cluster_by = "paciente_cpf", ) }} -with - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- - -- MERGING DATA: Merging Data from Different Sources - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- +with + ---=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- + -- MERGING DATA: Merging Data from Different Sources + ---=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- merged_data as ( select - paciente, + paciente, tipo, subtipo, entrada_datahora, saida_datahora, - exames_realizados, motivo_atendimento, desfecho_atendimento, condicoes, - null as prescricoes, -- VITAI source does not have prescription data - estabelecimento, + null as prescricoes, -- VITAI source does not have prescription data + estabelecimento, profissional_saude_responsavel, prontuario, metadados from {{ ref("int_historico_clinico__episodio__vitai") }} - union all + union all select - paciente, + paciente, tipo, subtipo, entrada_datahora, saida_datahora, - array( - select as struct - cast(null as string) as tipo, cast(null as string) as descricao - ) as exames_realizados, motivo_atendimento, desfecho_atendimento, condicoes, prescricoes, - estabelecimento, + estabelecimento, profissional_saude_responsavel, prontuario, metadados from {{ ref("int_historico_clinico__episodio__vitacare") }} ), - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- - -- FINGERPRINT: Adding Unique Hashed Field - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- + ---=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- + -- FINGERPRINT: Adding Unique Hashed Field + ---=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- fingerprinted as ( - select + select -- Patient Unique Identifier: for clustering purposes paciente.cpf as paciente_cpf, -- Encounter Unique Identifier: for testing purposes - farm_fingerprint( - concat(prontuario.fornecedor, prontuario.id_atendimento) - ) as id_atendimento, + farm_fingerprint(concat(prontuario.fornecedor, prontuario.id_atendimento)) as id_atendimento, -- Encounter Data merged_data.*, from merged_data - ), - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- - -- EXHIBITION CONFIGURATION: Configuring Exhibition Rules - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- - -- IS DATA FROM A MINOR? - exhibition_minor_age as ( - select - fingerprinted.id_atendimento, - safe_cast( - case - when paciente.data_nascimento is null - then false - when date_diff(current_date(), paciente.data_nascimento, year) >= 18 - then false - when date_diff(current_date(), paciente.data_nascimento, year) < 18 - then true - end as boolean - ) as tem_exibicao_limitada, - safe_cast( - case - when paciente.data_nascimento is null - then null - when date_diff(current_date(), paciente.data_nascimento, year) >= 18 - then null - when date_diff(current_date(), paciente.data_nascimento, year) < 18 - then "Menor de Idade" - end as string - ) as motivo - from fingerprinted - ), - -- IS THE PATIENT UNIDENTIFIED? - exhibition_no_identifier as ( - select - fingerprinted.id_atendimento, - safe_cast( - case - when paciente.cpf is null and array_length(paciente.cns) = 0 - then true - else false - end as boolean - ) as tem_exibicao_limitada, - safe_cast( - case - when paciente.cpf is null and array_length(paciente.cns) = 0 - then "Paciente sem CPF e CNS" - else null - end as string - ) as motivo - from fingerprinted - ), - -- IS THE EPISODE MISSING BASIC DATA? - exhibition_missing_basic_data as ( - select - fingerprinted.id_atendimento, - safe_cast( - case - when - array_length(fingerprinted.condicoes) = 0 - and fingerprinted.motivo_atendimento is null - and fingerprinted.desfecho_atendimento is null - and ( - array_length(fingerprinted.exames_realizados) = 0 - and fingerprinted.prontuario.fornecedor = 'vitai' - ) -- Caso de exames na vitai - then true - else false - end as boolean - ) as tem_exibicao_limitada, - safe_cast( - case - when - array_length(fingerprinted.condicoes) = 0 - and fingerprinted.motivo_atendimento is null - and fingerprinted.desfecho_atendimento is null - and ( - array_length(fingerprinted.exames_realizados) = 0 - and fingerprinted.prontuario.fornecedor = 'vitai' - ) -- Caso de exames na vitai - then "Episódio Não Informativo" - else null - end as string - ) as motivo - from fingerprinted - ), - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- - -- JOINING EXHIBITION RULES - -- -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-- - exhibition_configurations as ( - select * - from exhibition_minor_age - union all - select * - from exhibition_no_identifier - union all - select * - from exhibition_missing_basic_data - ), - exhibitions as ( - select - id_atendimento, - struct( - not (logical_or(tem_exibicao_limitada)) as indicador, - array_agg(motivo ignore nulls) as motivos - ) as exibicao - from exhibition_configurations - group by id_atendimento ) - -select fingerprinted.*, exhibitions.exibicao +select + *, from fingerprinted -inner join exhibitions using (id_atendimento) +where paciente_cpf is not null \ No newline at end of file diff --git a/models/raw/prontuario_vitai/raw_prontuario_vitai__exame.sql b/models/raw/prontuario_vitai/raw_prontuario_vitai__exame.sql index 3adff309..704501fe 100644 --- a/models/raw/prontuario_vitai/raw_prontuario_vitai__exame.sql +++ b/models/raw/prontuario_vitai/raw_prontuario_vitai__exame.sql @@ -56,7 +56,7 @@ select safe_cast(indicacaoclinica as string) as indicacao_clinica, safe_cast(mnemonico as string) as mnemonico, safe_cast(tipo as string) as tipo, - safe_cast(exame as string) as exame, + safe_cast(exame as string) as exame_descricao, safe_cast(medico_solicitante_nome as string) as medico_solicitante_nome, safe_cast(statusitem as string) as status_item, safe_cast(cpf as string) as cpf,