Processamento SQL
-- sumario do pcdt
create table db_sabeis.tf_pcdt as
select
co_pcdt,
'BR' as sg_uf,
min(nu_competencia) as nu_competencia_min,
max(nu_competencia) as nu_competencia_max,
count(distinct co_ibge_estabelecimento) as qt_municipios_atendimento,
count(distinct co_ibge_paciente) as qt_municipios_paciente,
count(distinct co_ibge_gestao) as qt_secretarias,
count(distinct co_cns_paciente) as qt_cns_pacientes,
sum(case when nu_idade_paciente < 21 then 1 else 0 end) as qt_00a20,
sum(case when nu_idade_paciente between 21 and 40 then 1 else 0 end) as qt_21a40,
sum(case when nu_idade_paciente between 41 and 60 then 1 else 0 end) as qt_41a60,
sum(case when nu_idade_paciente > 60 then 1 else 0 end) as qt_61a00,
sum(case when sg_sexo_paciente = 'F' then 1 else 0 end) as qt_sexoF,
sum(case when sg_sexo_paciente = 'M' then 1 else 0 end) as qt_sexoM,
sum(st_obito_paciente) as qt_obito_paciente,
count(distinct co_cid10_diagnostico_principal) as qt_cid,
count(distinct co_sigtap_procedimento) as qt_sigtap,
count(*) as qt_registros,
sum(qt_aprovada) as qt_aprovada,
sum(vl_aprovado_ipca) as vl_aprovado_ipca,
sum(case when st_redesbr=1 then 1 else 0 end) as qt_redesbr1,
sum(case when st_redesbr=2 then 1 else 0 end) as qt_redesbr2,
sum(case when st_redesbr=3 then 1 else 0 end) as qt_redesbr3,
sum(case when st_redesbr=4 then 1 else 0 end) as qt_redesbr4,
sum(case when st_redesbr=5 then 1 else 0 end) as qt_redesbr5
from db_sabeis.tf_apac_medicamento
group by 1;
insert into db_sabeis.tf_pcdt
select
co_pcdt,
substr(co_ibge_paciente::text,1,2) as sg_uf,
min(nu_competencia) as nu_competencia_min,
max(nu_competencia) as nu_competencia_max,
count(distinct co_ibge_estabelecimento) as qt_municipios_atendimento,
count(distinct co_ibge_paciente) as qt_municipios_paciente,
count(distinct co_ibge_gestao) as qt_secretarias,
count(distinct co_cns_paciente) as qt_cns_pacientes,
sum(case when nu_idade_paciente < 21 then 1 else 0 end) as qt_00a20,
sum(case when nu_idade_paciente between 21 and 40 then 1 else 0 end) as qt_21a40,
sum(case when nu_idade_paciente between 41 and 60 then 1 else 0 end) as qt_41a60,
sum(case when nu_idade_paciente > 60 then 1 else 0 end) as qt_61a00,
sum(case when sg_sexo_paciente = 'F' then 1 else 0 end) as qt_sexoF,
sum(case when sg_sexo_paciente = 'M' then 1 else 0 end) as qt_sexoM,
sum(st_obito_paciente) as qt_obito_paciente,
count(distinct co_cid10_diagnostico_principal) as qt_cid,
count(distinct co_sigtap_procedimento) as qt_sigtap,
count(*) as qt_registros,
sum(qt_aprovada) as qt_aprovada,
sum(vl_aprovado_ipca) as vl_aprovado_ipca,
sum(case when st_redesbr=1 then 1 else 0 end) as qt_redesbr1,
sum(case when st_redesbr=2 then 1 else 0 end) as qt_redesbr2,
sum(case when st_redesbr=3 then 1 else 0 end) as qt_redesbr3,
sum(case when st_redesbr=4 then 1 else 0 end) as qt_redesbr4,
sum(case when st_redesbr=5 then 1 else 0 end) as qt_redesbr5
from db_sabeis.tf_apac_medicamento
group by 1,2;
insert into db_sabeis.tf_pcdt
select
'0',
'BR' as sg_uf,
min(nu_competencia) as nu_competencia_min,
max(nu_competencia) as nu_competencia_max,
count(distinct co_ibge_estabelecimento) as qt_municipios_atendimento,
count(distinct co_ibge_paciente) as qt_municipios_paciente,
count(distinct co_ibge_gestao) as qt_secretarias,
count(distinct co_cns_paciente) as qt_cns_pacientes,
sum(case when nu_idade_paciente < 21 then 1 else 0 end) as qt_00a20,
sum(case when nu_idade_paciente between 21 and 40 then 1 else 0 end) as qt_21a40,
sum(case when nu_idade_paciente between 41 and 60 then 1 else 0 end) as qt_41a60,
sum(case when nu_idade_paciente > 60 then 1 else 0 end) as qt_61a00,
sum(case when sg_sexo_paciente = 'F' then 1 else 0 end) as qt_sexoF,
sum(case when sg_sexo_paciente = 'M' then 1 else 0 end) as qt_sexoM,
sum(st_obito_paciente) as qt_obito_paciente,
count(distinct co_cid10_diagnostico_principal) as qt_cid,
count(distinct co_sigtap_procedimento) as qt_sigtap,
count(*) as qt_registros,
sum(qt_aprovada) as qt_aprovada,
sum(vl_aprovado_ipca) as vl_aprovado_ipca,
sum(case when st_redesbr=1 then 1 else 0 end) as qt_redesbr1,
sum(case when st_redesbr=2 then 1 else 0 end) as qt_redesbr2,
sum(case when st_redesbr=3 then 1 else 0 end) as qt_redesbr3,
sum(case when st_redesbr=4 then 1 else 0 end) as qt_redesbr4,
sum(case when st_redesbr=5 then 1 else 0 end) as qt_redesbr5
from db_sabeis.tf_apac_medicamento;
update db_sabeis.tf_pcdt A
set sg_uf=B.sg_uf
from db_aux.tb_uf B
where A.sg_uf=B.co_uf_ibge;
-- perfil de usuarios por pdcb
create table tmp.tm_paciente as
select
A.co_cns_paciente,
A.co_cns_paciente,
A.co_cns_paciente,
A.co_cns_paciente,
A.co_pcdt,
B.sg_sexo_paciente,
B.nu_ano_nascimento,
case when sum(A.st_obito_paciente) > 0 then 1 else 0 end as st_obito_paciente,
substring(min(A.nu_competencia_min)::text,1,4)::int as nu_ano_min
from db_sabeis.tf_evento_medicamento A
left join db_sabeis.tf_paciente B
on A.co_cns_paciente=B.co_cns_paciente
group by 1,2,3,4
order by 1,2,3,4;
CREATE INDEX tf_tm_paciente_cns
ON tmp.tm_paciente (co_cns_paciente);
create table tmp.tm_paciente_pcdt as
select co_pcdt, count(distinct co_cns_paciente) as qt_registros_pcdt from tmp.tm_paciente group by 1;
drop table if exists db_sabeis.tf_pcdt_paciente;
create table db_sabeis.tf_pcdt_paciente as
select
A.co_pcdt,
sum(case when sg_sexo_paciente ='M' then 1 else 0 end) as qt_paciente_m,
sum(case when sg_sexo_paciente ='F' then 1 else 0 end) as qt_paciente_f,
sum(case when sg_sexo_paciente ='M' and st_obito_paciente=1 then 1 else 0 end) as qt_obito_m,
sum(case when sg_sexo_paciente ='F' and st_obito_paciente=1 then 1 else 0 end) as qt_obito_f,
case
when nu_ano_min-nu_ano_nascimento between 0 and 4 then '00-04'
when nu_ano_min-nu_ano_nascimento between 5 and 9 then '05-09'
when nu_ano_min-nu_ano_nascimento between 10 and 14 then '10-14'
when nu_ano_min-nu_ano_nascimento between 15 and 19 then '15-19'
when nu_ano_min-nu_ano_nascimento between 20 and 24 then '20-24'
when nu_ano_min-nu_ano_nascimento between 25 and 29 then '25-29'
when nu_ano_min-nu_ano_nascimento between 30 and 34 then '30-34'
when nu_ano_min-nu_ano_nascimento between 35 and 39 then '35-39'
when nu_ano_min-nu_ano_nascimento between 40 and 44 then '40-44'
when nu_ano_min-nu_ano_nascimento between 45 and 49 then '45-49'
when nu_ano_min-nu_ano_nascimento between 50 and 54 then '50-54'
when nu_ano_min-nu_ano_nascimento between 55 and 59 then '55-59'
when nu_ano_min-nu_ano_nascimento between 60 and 64 then '60-64'
when nu_ano_min-nu_ano_nascimento between 65 and 69 then '65-69'
when nu_ano_min-nu_ano_nascimento between 70 and 74 then '70-74'
when nu_ano_min-nu_ano_nascimento between 75 and 79 then '75-79'
when nu_ano_min-nu_ano_nascimento between 80 and 84 then '80-84'
when nu_ano_min-nu_ano_nascimento between 85 and 89 then '85-89'
when nu_ano_min-nu_ano_nascimento >=90 then '90+'
else 'SemInfo'
end as sg_faixa_etaria,
qt_registros_pcdt
from tmp.tm_paciente A
left join tmp.tm_paciente_pcdt B
on A.co_pcdt=B.co_pcdt
group by 1,6,qt_registros_pcdt
order by 1,6;
CREATE INDEX tf_pcdt_paciente_pcdt
ON db_sabeis.tf_pcdt_paciente (co_pcdt);
-- estabelecimentos por pcdt
drop table if exists db_sabeis.tf_pcdt_estabelecimento;
create table db_sabeis.tf_pcdt_estabelecimento as
select
co_pcdt,
co_cnes_estabelecimento,
substr(co_ibge_estabelecimento::text,1,2)::int as co_uf_ibge_estabelecimento,
count(*) as qt_dispensacao,
count(distinct co_cns_paciente) as qt_cns_paciente,
min(nu_competencia) as nu_competencia_min,
max(nu_competencia) as nu_competencia_max
from db_sabeis.tf_apac_medicamento
where qt_aprovada > 0
and co_cns_paciente > 0
group by 1,2,3
order by 1,3,2;
CREATE INDEX tf_pcdt_estabelecimento_pcdt
ON db_sabeis.tf_pcdt_estabelecimento (co_pcdt);
drop table if exists db_sabeis.tf_pcdt_estabelecimento_uf;
create table db_sabeis.tf_pcdt_estabelecimento_uf as
select co_pcdt,
substr(co_ibge_estabelecimento::text,1,2)::int as co_uf_ibge_estabelecimento,
substr(nu_competencia::text,1,4)::int as nu_ano_competencia,
count(distinct co_cnes_estabelecimento) as qt_cnes_estabelecimento
from db_sabeis.tf_apac_medicamento
group by 1,2,3 ;
-- municipios de residencia por pcdt
drop table if exists db_sabeis.tf_pcdt_municipio_residencia;
create table db_sabeis.tf_pcdt_municipio_residencia as
select
co_pcdt,
co_ibge_paciente,
B.sg_uf,
B.nu_populacao_2010,
count(*) as qt_dispensacao,
count(distinct co_cns_paciente) as qt_cns_paciente,
min(nu_competencia) as nu_competencia_min,
max(nu_competencia) as nu_competencia_max
from db_sabeis.tf_apac_medicamento A
left join db_sabeis.td_municipio B
on A.co_ibge_paciente=B.co_municipio_ibge
where qt_aprovada > 0
and co_cns_paciente > 0
group by 1,2,3,4
order by 1,3,2;
CREATE INDEX tf_pcdt_municipio_residencia_pcdt
ON db_sabeis.tf_pcdt_municipio_residencia (co_pcdt);
update db_sabeis.tf_pcdt_municipio_residencia set co_pcdt = 0 where co_pcdt is null;
alter table db_sabeis.tf_pcdt_municipio_residencia
add sg_regiao_redes varchar(15) default null,
add sg_regiao_pais varchar(2) default null;
update db_sabeis.tf_pcdt_municipio_residencia A
set sg_uf = B.sg_uf,
nu_populacao_2010 = B.nu_populacao_2010,
sg_regiao_pais =
case
when st_regiao_pais = '1' then 'N'
when st_regiao_pais = '2' then 'NE'
when st_regiao_pais = '3' then 'SE'
when st_regiao_pais = '4' then 'S'
when st_regiao_pais = '5' then 'CO'
else 'ni'
end
from db_sabeis.tb_municipio_ibge B
where A.co_ibge_paciente=B.co_municipio_ibge;
update db_sabeis.tf_pcdt_municipio_residencia A
set sg_uf = B.sg_uf,
sg_regiao_pais = B.sg_regiao_pais
update db_sabeis.tf_pcdt_municipio_residencia A
set sg_uf = B.sg_uf,
nu_populacao_2010 = qt_populacao
from db_aux.tf_populacao_censo B
where co_ibge_paciente = B.co_municipio_ibge;
update db_sabeis.tf_pcdt_municipio_residencia A
set sg_regiao_redes =
case
when B.st_grupo_regiao = '1' then 'baixíssimo'
when B.st_grupo_regiao = '2' then 'baixo'
when B.st_grupo_regiao = '3' then 'médio'
when B.st_grupo_regiao = '4' then 'alto'
when B.st_grupo_regiao = '5' then 'altíssimo'
else 'ni'
end
from db_sabeis.td_redesbr B
where A.co_ibge_paciente=B.co_municipio_ibge;
alter table db_sabeis.tf_pcdt_municipio_residencia add qt_meses smallint default null;
update db_sabeis.tf_pcdt_municipio_residencia A
set qt_meses = B.qt_meses
from (
select
co_pcdt, co_ibge_paciente,
round(extract(year from age(to_date(nu_competencia_max::text, 'YYYYMM'),to_date(nu_competencia_min::text, 'YYYYMM'))) * 12 +
extract(month from age(to_date(nu_competencia_max::text, 'YYYYMM'),to_date(nu_competencia_min::text, 'YYYYMM')))+1)::int as qt_meses
from db_sabeis.tf_pcdt_municipio_residencia) B
where A.co_pcdt=B.co_pcdt and A.co_ibge_paciente = B.co_ibge_paciente;
alter table db_sabeis.tf_pcdt_municipio_residencia add qt_municipio_uf smallint default null;
update db_sabeis.tf_pcdt_municipio_residencia A
set qt_municipio_uf = B.qt_municipio_uf
from (
select sg_uf, count(*) as qt_municipio_uf
from (select distinct co_municipio_ibge, sg_uf from db_sabeis.tb_municipio_ibge) X
group by 1) B
where A.sg_uf=B.sg_uf
;
select
co_pcdt,
sg_uf,
-- count(distinct co_ibge_paciente)::float/qt_municipio_uf as qt_ibge_paciente,
sum(qt_cns_paciente)::float/qt_meses/sum(nu_populacao_2010) as qt_cns_mes_hab
from db_sabeis.tf_pcdt_municipio_residencia
group by 1,2, qt_meses -- , qt_municipio_uf;
create table db_sabeis.tf_pcdt_municipio_residencia_cobertura AS
select
co_pcdt,
sg_uf,
ROUND(case when sg_uf='DF' then 100 else count(distinct co_ibge_paciente)::float/max(qt_municipio_uf)*100 end)::INT as qt_cobertura_municipio_uf,
sum(qt_cns_paciente)::float/round(extract(year from age(to_date(max(nu_competencia_max)::text, 'YYYYMM'),to_date(min(nu_competencia_min)::text, 'YYYYMM'))) * 12 +
extract(month from age(to_date(max(nu_competencia_max)::text, 'YYYYMM'),to_date(min(nu_competencia_min)::text, 'YYYYMM')))+1)::int/max(nu_populacao_2010)*1000000 as qt_cns_mes_habitante
from db_sabeis.tf_pcdt_municipio_residencia
group by 1,2;
-- produtos por pcdt
drop table if exists db_sabeis.tf_pcdt_produto_ano;
create table db_sabeis.tf_pcdt_produto_ano as
select X.*,
C.sg_forma_organizacao,
DENSE_RANK() OVER(PARTITION by co_pcdt, nu_ano_competencia, sg_forma_organizacao ORDER BY qt_cns_paciente desc) as co_seq_qt_cns_forma_organizacao
from
(
select A.*,
DENSE_RANK() OVER(PARTITION by A.co_pcdt, A.nu_ano_competencia ORDER BY A.qt_cns_paciente desc) as co_seq_qt_cns,
B.qt_cns_paciente as qt_cns_paciente_total,
B.qt_dispensacao as qt_dispensacao_total
from
(
select
coalesce(A.co_pcdt,0) as co_pcdt,
B.sg_procedimento,
substring(nu_competencia::text,1,4)::int as nu_ano_competencia,
count(*) as qt_dispensacao,
count(distinct co_cns_paciente) as qt_cns_paciente
from db_sabeis.tf_apac_medicamento A
left join db_sabeis.td_sigtap_medicamento_abrev B
on A.co_sigtap_procedimento=B.nu_sigtap
where qt_aprovada > 0
and co_cns_paciente > 0
group by 1,2,3
order by 1,2,3
) A
left join
(select
coalesce(co_pcdt,0) as co_pcdt,
substring(nu_competencia::text,1,4)::int as nu_ano_competencia,
count(*) as qt_dispensacao,
count(distinct co_cns_paciente) as qt_cns_paciente
from db_sabeis.tf_apac_medicamento
where qt_aprovada > 0
group by 1,2
) B
on A.co_pcdt=B.co_pcdt
and A.nu_ano_competencia=B.nu_ano_competencia
) X
left join db_sabeis.td_sigtap_medicamento_abrev_cmpmax C
on X.sg_procedimento=C.sg_procedimento;
select * from db_sabeis.tf_pcdt_produto_ano where co_pcdt=10 order by nu_ano_competencia, co_seq_qt_cns;
drop table if exists db_sabeis.tf_pcdt_produto_ano_outros;
create table db_sabeis.tf_pcdt_produto_ano_outros as
select A.*,
B.qt_cns_paciente_total,
B.qt_dispensacao_total,
round(A.qt_cns_paciente::float/B.qt_cns_paciente_total*100)::int as qt_cns_paciente_percentual,
round(A.qt_dispensacao::float/B.qt_dispensacao_total*100)::int as qt_dispensacao_percentual
from
(
select
A.co_pcdt,
A.nu_ano_competencia,
case when co_seq_cns_paciente <= 7 then A.sg_procedimento else 'outros' end as sg_procedimento,
'total' as sg_agregacao,
STRING_AGG(distinct sg_procedimento::text, ', ') as sg_procedimento_outros,
sum(qt_cns_paciente) as qt_cns_paciente,
sum(qt_dispensacao) as qt_dispensacao
from db_sabeis.tf_pcdt_produto_ano A
group by 1,2,3
) A
left join
(select
co_pcdt,
nu_ano_competencia,
sum(qt_cns_paciente) as qt_cns_paciente_total,
sum(qt_dispensacao) as qt_dispensacao_total
from db_sabeis.tf_pcdt_produto_ano
group by 1,2
) B
on A.co_pcdt=B.co_pcdt and A.nu_ano_competencia=B.nu_ano_competencia
update db_sabeis.tf_pcdt_produto_ano_outros A
set qt_cns_paciente_percentual=B.qt_cns_paciente_percentual,
qt_dispensacao_percentual=B.qt_dispensacao_percentual
from
(
select
co_pcdt,
nu_ano_competencia,
100-sum(qt_cns_paciente_percentual) as qt_cns_paciente_percentual,
100-sum(qt_dispensacao_percentual) as qt_dispensacao_percentual
from db_sabeis.tf_pcdt_produto_ano_outros
where sg_procedimento <> 'outros'
group by 1,2
) B
where A.co_pcdt=B.co_pcdt
and A.nu_ano_competencia=B.nu_ano_competencia
and A.sg_procedimento='outros';
alter table db_sabeis.tf_pcdt_produto_ano_outros add sg_forma_organizacao varchar(10) default 'total';
update db_sabeis.tf_pcdt_produto_ano_outros A
set sg_forma_organizacao=B.sg_forma_organizacao
from db_sabeis.td_sigtap_medicamento_abrev B
where A.sg_procedimento=B.sg_procedimento and B.nu_competencia_max='201905';
-- doencas por pcdt
drop table if exists db_sabeis.tf_pcdt_doenca_trimestre;
create table db_sabeis.tf_pcdt_doenca_trimestre as
select
*,
DENSE_RANK() OVER(PARTITION by co_pcdt, co_cid10_diagnostico_principal ORDER BY co_pcdt, nu_trimestre, co_cid10_diagnostico_principal) as co_seq_pcdt_cid10_trimestre
from (
select
co_pcdt,
co_cid10_diagnostico_principal,
extract(year from to_date(nu_competencia_min::text, 'YYYYMM'))::text || '0' || extract(quarter from to_date(nu_competencia_min::text, 'YYYYMM'))::text as nu_trimestre,
count(distinct co_cns_paciente) as qt_cns_paciente
from
(
select
co_pcdt,
co_cns_paciente,
co_cid10_diagnostico_principal,
min(nu_competencia_min) as nu_competencia_min
from db_sabeis.tm_evento_cid
where co_pcdt > 0
and co_cns_paciente > 0
group by 1,2,3
) X
group by 1,2,3
order by 1,2,3
) X;
-- sumario sigtap e cid
create table db_sabeis.tf_apac_medicamento_sumario as
select
co_pcdt,
co_cid10_diagnostico_principal,
co_sigtap_procedimento,
min(nu_competencia) as nu_competencia_min,
max(nu_competencia) as nu_competencia_max,
sum(qt_aprovada) as qt_aprovada,
count(distinct nu_autorizacao) as qt_autorizacao,
count(distinct co_cns_paciente) as qt_cns_paciente,
count(distinct co_ibge_paciente) as qt_municipios_paciente,
count(distinct co_cnes_estabelecimento) as qt_cnes
from db_sabeis.tf_apac_medicamento
where qt_aprovada > 0
and co_cns_paciente > 0
-- and co_sigtap_procedimento > 0
-- and co_cid10_diagnostico_principal is not null
group by 1,2,3;
alter table db_sabeis.tf_apac_medicamento_sumario
add sg_procedimento varchar(100) default null,
add no_procedimento varchar(255) default null,
add no_cid10_diagnostico_principal varchar(255) default null;
update db_sabeis.tf_apac_medicamento_sumario A
set sg_procedimento = B.sg_procedimento,
no_procedimento = B.no_procedimento
from db_sabeis.td_sigtap_medicamento_abrev B
where A.co_sigtap_procedimento = B.nu_sigtap;
update db_sabeis.tf_apac_medicamento_sumario A
set no_cid10_diagnostico_principal = B.no_cid
from db_sabeis.td_cid10 B
where A.co_cid10_diagnostico_principal = B.co_cid;
select * from db_sabeis.tf_apac_medicamento_sumario;
drop table if exists db_sabeis.tf_pcdt_cns;
create table db_sabeis.tf_pcdt_cns as
select distinct Z.sg_uf, coalesce(no_pcdt,'outros') as no_pcdt, qt_cns_mes::float/qt_populacao as qt_cns_mes
from (
select
sg_uf,
case when co_seq > 7 then 0 else co_pcdt end as co_pcdt,
round(sum(qt_cns_mes))::int as qt_cns_mes
from
(
select
*,
DENSE_RANK() OVER(PARTITION by sg_uf ORDER BY qt_cns_mes desc) as co_seq
from
(
select
co_pcdt,
sg_uf,
qt_cns_pacientes::float/round(extract(year from age(to_date(nu_competencia_max::text, 'YYYYMM'),to_date(nu_competencia_min::text, 'YYYYMM'))) * 12 +
extract(month from age(to_date(nu_competencia_max::text, 'YYYYMM'),to_date(nu_competencia_min::text, 'YYYYMM')))+1)::int as qt_cns_mes
from db_sabeis.tf_pcdt
where sg_uf <> 'BR'
) X
where co_pcdt is not null
) Y
group by 1,2
order by 1,3 desc) Z
left join db_sabeis.td_pcdt_cid C
on Z.co_pcdt = C.co_seq_pcdt
left join db_aux.td_populacao_uf_2010 D
on Z.sg_uf = D.sg_uf;
drop table if exists db_sabeis.tf_pcdt_medicamento_trimestre;
create table db_sabeis.tf_pcdt_medicamento_trimestre as
select
co_pcdt,
extract(
year from to_date(nu_competencia::text, 'YYYYMM'))::text ||
'0' ||
extract(quarter from to_date(nu_competencia::text, 'YYYYMM'))::text as nu_trimestre,
sg_procedimento,
sum(case when sg_sexo_paciente = 'F' then 1 else 0 end) as qt_sexo_f,
sum(case when nu_idade_paciente > 60 then 1 else 0 end) as qt_idade_paciente60,
sum(case when st_redesbr > 2 then 1 else 0 end) as qt_st_redesbr3,
count(distinct co_ibge_gestao) as qt_ibge_gestao,
sum(qt_aprovada) as qt_aprovada,
count(*) as qt_dispensacao,
count(distinct co_cns_paciente) as qt_cns_paciente
from db_sabeis.tf_apac_medicamento A
left join db_sabeis.tm_abrev B
on A.co_sigtap_procedimento=B.nu_sigtap
where A.qt_aprovada > 0
and A.co_cns_paciente > 0
group by 1,2,3;
drop table if exists db_sabeis.tf_medicamento_trimestre;
create table db_sabeis.tf_medicamento_trimestre as
select
extract(
year from to_date(nu_competencia::text, 'YYYYMM'))::text ||
'0' ||
extract(quarter from to_date(nu_competencia::text, 'YYYYMM'))::text as nu_trimestre,
sg_procedimento,
sum(case when sg_sexo_paciente = 'F' then 1 else 0 end) as qt_sexo_f,
sum(case when nu_idade_paciente > 60 then 1 else 0 end) as qt_idade_paciente60,
sum(case when st_redesbr > 2 then 1 else 0 end) as qt_st_redesbr3,
count(distinct co_ibge_gestao) as qt_ibge_gestao,
sum(qt_aprovada) as qt_aprovada,
count(*) as qt_dispensacao,
count(distinct co_cns_paciente) as qt_cns_paciente
from db_sabeis.tf_apac_medicamento A
left join db_sabeis.tm_abrev B
on A.co_sigtap_procedimento=B.nu_sigtap
where A.qt_aprovada > 0
and A.co_cns_paciente > 0
group by 1,2,3;
create table tmp.tf_apac_medicamento_sumario as
select * from db_sabeis.tf_apac_medicamento_sumario
where co_sigtap_procedimento > 0
and co_pcdt > 0
and qt_cns_paciente > 0
and no_cid10_diagnostico_principal is not null
order by 1,2,3 ;
drop table if exists db_sabeis.td_pcdt_abrev;
create table db_sabeis.td_pcdt_abrev as
select distinct
A.co_pcdt,
A.sg_procedimento,
B.no_procedimento
from db_sabeis.tf_brasil_cid10_sigtap A
left join db_sabeis.td_procedimento_abrev B
on A.sg_procedimento=B.sg_procedimento
where qt_cns_pacientes > 1000 and co_pcdt >= 0
order by 1,2;
-- troca de medicamentos
drop table db_sabeis.tf_troca;
create table db_sabeis.tf_troca as
select
co_pcdt,
sg_procedimentoA,
case when co_seq > 10 then 'outros' else sg_procedimentoB end as sg_procedimentoB,
sum(qt_cns_paciente) as qt_cns_paciente,
STRING_AGG(distinct sg_procedimentoB::text, ', ') as sg_procedimentoB2
from
(
select *,
DENSE_RANK() OVER(PARTITION by co_pcdt ORDER BY qt_cns_paciente desc) as co_seq
from
(
select co_pcdt,
sg_procedimentoA,
sg_procedimentoB,
sum(qt_cns_paciente) as qt_cns_paciente
from
(
select A.co_pcdt,
A.sg_procedimentoA,
B.sg_procedimentoB,
count(distinct A.co_cns_paciente) as qt_cns_paciente
from
(
select co_pcdt,
co_cns_paciente,
sg_procedimento as sg_procedimentoA
from db_sabeis.tf_evento_medicamento
where co_seq_evento=1
) A
left join
(
select co_pcdt,
sg_procedimento as sg_procedimentoB,
co_cns_paciente
from db_sabeis.tf_evento_medicamento
where co_seq_evento=2
) B
on A.co_cns_paciente=B.co_cns_paciente
where sg_procedimentoB is not null
group by 1,2,3
union
select A.co_pcdt,
A.sg_procedimentoA,
B.sg_procedimentoB,
count(distinct A.co_cns_paciente) as qt_cns_paciente
from
(
select co_pcdt,
co_cns_paciente,
sg_procedimento as sg_procedimentoA
from db_sabeis.tf_evento_medicamento
where co_seq_evento=2
) A
left join
(
select co_pcdt,
sg_procedimento as sg_procedimentoB,
co_cns_paciente
from db_sabeis.tf_evento_medicamento
where co_seq_evento=3
) B
on A.co_cns_paciente=B.co_cns_paciente
where sg_procedimentoB is not null
group by 1,2,3
union
select A.co_pcdt,
A.sg_procedimentoA,
B.sg_procedimentoB,
count(distinct A.co_cns_paciente) as qt_cns_paciente
from
(
select co_pcdt,
co_cns_paciente,
sg_procedimento as sg_procedimentoA
from db_sabeis.tf_evento_medicamento
where co_seq_evento=3
) A
left join
(
select co_pcdt,
sg_procedimento as sg_procedimentoB,
co_cns_paciente
from db_sabeis.tf_evento_medicamento
where co_seq_evento=4
) B
on A.co_cns_paciente=B.co_cns_paciente
where sg_procedimentoB is not null
group by 1,2,3
) X
group by 1,2,3
order by 1,4 desc
) Y
) Z
where co_seq <=10
group by 1,2,3
create table db_sabeis.td_sigtap_medicamento_abrev_cmpmax as
select A.* from db_sabeis.td_sigtap_medicamento_abrev A,
(
select sg_procedimento,
max(nu_competencia_max) as nu_competencia_max
from db_sabeis.td_sigtap_medicamento_abrev
group by 1
) B
where A.sg_procedimento=B.sg_procedimento
and A.nu_competencia_max=B.nu_competencia_max
order by 1,2;
-- pareto de pacientes e medicamentos
drop table if exists
db_sabeis.tf_procedimento_paciente_tempo,
db_sabeis.tm_procedimento_paciente_tempo;
create table db_sabeis.tm_procedimento_paciente_tempo as
select *,
DENSE_RANK() OVER(PARTITION by co_pcdt, nu_ano_competencia ORDER BY qt_paciente_tempo desc) as co_seq_pcdt_ano
from (
select co_pcdt,
sg_procedimento,
nu_ano_competencia,
sum(qt_registros::float/12) as qt_paciente_tempo,
avg(qt_registros) as qt_registros_avg,
stddev(qt_registros) as qt_registros_std
from (
select
A.co_pcdt,
B.sg_procedimento,
substring(A.nu_competencia::text,1,4)::int as nu_ano_competencia,
co_cns_paciente,
count(*) as qt_registros
from db_sabeis.tf_apac_medicamento A
left join db_sabeis.td_sigtap_medicamento_abrev B
on A.co_sigtap_procedimento=B.nu_sigtap
where qt_aprovada > 0
and co_cns_paciente > 0
group by 1,2,3,4
) X
group by 1,2,3
) X;
drop table if exists db_sabeis.tf_procedimento_paciente_tempo;
create table db_sabeis.tf_procedimento_paciente_tempo as
select
*,
case
when qt_acum > 0.8 then 'A'
when qt_acum between 0.5 and 0.8 then 'B'
else 'C' end as sg_abc
from
(
select
A.*,
sum(A.qt_paciente_tempo/qt_paciente_tempo_total) OVER (PARTITION BY A.co_pcdt, A.nu_ano_competencia ORDER BY A.qt_paciente_tempo) as qt_acum
from db_sabeis.tm_procedimento_paciente_tempo A
left join
(select co_pcdt, nu_ano_competencia, sum(qt_paciente_tempo) as qt_paciente_tempo_total
from db_sabeis.tm_procedimento_paciente_tempo group by 1,2) B
on A.co_pcdt=B.co_pcdt and A.nu_ano_competencia=B.nu_ano_competencia
) x
order by 1,3,4 desc;
select * from db_sabeis.tf_procedimento_paciente_tempo where nu_ano_competencia=2018;
drop table if exists db_sabeis.tf_procedimento_paciente_tempo;
select sg_procedimento,
count(distinct A.co_cns_paciente) as qt_cns_paciente
from db_sabeis.tf_evento_medicamento A,
(
select co_cns_paciente
from db_sabeis.tf_evento_medicamento
where sg_procedimento like '%INFL%'
and nu_competencia_min >= 201201
and nu_competencia_max <= 201212
) B
where A.co_cns_paciente = B.co_cns_paciente
and A.nu_competencia_min >= 201201
and A.nu_competencia_max <= 201312
and sg_procedimento not like '%INFL%'
group by 1
order by 2 desc
create table db_sabeis.tm_etl_am as
select * from db_sabeis.tm_etl where sg_sistema='SIA' and nu_competencia::int > 200800 and sg_tabela in ('PA','AM') order by sg_uf, nu_competencia::int;
select * from db_sabeis.tm_etl;
drop table if exists db_sabeis.tm_pcdt_qt;
create table db_sabeis.tm_pcdt_qt as
select A.*, B.no_pcdt
from
(
select
co_pcdt,
count(*) as qt_registros,
count(distinct co_cns_paciente) as qt_cns
from db_sabeis.tf_apac_medicamento
where co_pcdt in (select co_pcdt from db_sabeis.td_pcdt_abrev)
group by co_pcdt
having count(*) > 0
order by 2 desc
) A
left join (select distinct co_seq_pcdt, no_pcdt from db_sabeis.td_pcdt_cid) B
on A.co_pcdt=B.co_seq_pcdt;
alter table db_sabeis.tf_apac_medicamento_sumario add st_td_pcdt_abrev smallint default 0;
update db_sabeis.tf_apac_medicamento_sumario A
set st_td_pcdt_abrev = 1
from db_sabeis.td_pcdt_abrev B
where A.co_pcdt=B.co_pcdt and A.sg_procedimento=B.sg_procedimento;