Skip to content

Commit

Permalink
Fix after merge issues to build episodio assistencial
Browse files Browse the repository at this point in the history
  • Loading branch information
ThiagoTrabach committed Aug 28, 2024
1 parent 06ea78d commit 4a2dbb5
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 164 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -159,7 +158,7 @@ with
dim_estabelecimento.estabelecimento,

-- Profissional
ARRAY(
(
SELECT AS STRUCT
dim_profissional.id as id,
dim_profissional.cpf as cpf,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand All @@ -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 *
Expand Down Expand Up @@ -178,7 +191,7 @@ with
from queixa_all
where ordenacao = 1
),
-- Desfecho do atendimento
-- Desfecho do atendimento
desfecho_atendimento_all as (
select
gid_boletim,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
151 changes: 19 additions & 132 deletions models/marts/historico_clinico/mart_historico_clinico__episodio.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 4a2dbb5

Please sign in to comment.