SIH · AIH reduzida (sih_aih_reduzida)¶
Em uma frase¶
Autorizações de Internação Hospitalar (AIH) do Sistema de Informações Hospitalares do SUS (SIH/SUS), nos arquivos RD que o DATASUS publica um por UF e mês de processamento.
O que um registro representa¶
- O dicionário da biblioteca descreve a base como "SIHSUS — AIH Reduzida (RD)" e não
declara chave primária (
src/omnisus/data/dicionarios/sih_aih_reduzida.yaml,title, semprimaryKey). - O documento oficial descreve o layout dos arquivos
RD*.dbfpara janeiro de 2008 em diante (Informe SIH 2016-03, p. 1). - Cada linha traz o número da AIH em
n_aih, com 13 caracteres, e o tipo da AIH emident(Informe SIH 2016-03, p. 1). - O documento não lista os códigos de
ident(Informe SIH 2016-03, p. 1); o dicionário os decodifica como 1 = AIH principal, 3 = AIH de continuação e 5 = AIH de longa permanência (src/omnisus/data/dicionarios/sih_aih_reduzida.yaml). seq_aih5é o sequencial de longa permanência, da AIH tipo 5 (Informe SIH 2016-03, p. 3).- O layout RD não traz o número do Cartão Nacional de Saúde do paciente
(Informe SIH 2016-03, p. 1–4);
aud_justesis_justguardam a justificativa para aceitar a AIH sem esse número (p. 3). homonimoindica se o paciente da AIH é homônimo do paciente de outra AIH (Informe SIH 2016-03, p. 3).diag_princé o código do diagnóstico principal pela CID-10, com 4 caracteres (Informe SIH 2016-03, p. 2), e o dicionário o liga à tabelaaux_cid10(src/omnisus/data/dicionarios/sih_aih_reduzida.yaml).val_toté o valor total da AIH (Informe SIH 2016-03, p. 2).- A importação grava as colunas do arquivo com nomes em minúsculas e acrescenta
ano,uf,mese_source_releasea cada linha (src/omnisus/sources/datasus_ftp/staging.py,dbc_bytes_to_parquet;src/omnisus/sources/datasus_ftp/_runner.py,ingest_raw).
Datas e geografia¶
ano_cmptemes_cmptsão o ano e o mês de processamento da AIH (Informe SIH 2016-03, p. 1), e a data de internação é outro campo (p. 2).- A data de internação está em
dt_intere a data de saída emdt_saida, ambas no formato aaaammdd no recorte; o Informe SIH 2016-03, p. 2, declara char(8), mas grafa o primeiro campoDI_INTERe seu formatoaaammdd, inconsistências documentais preservadas na auditoria. nascé a data de nascimento do paciente, no formato aaaammdd (Informe SIH 2016-03, p. 1).gestor_dté a data da autorização dada pelo gestor, no formato aaaammdd (Informe SIH 2016-03, p. 3).- As colunas
ano,ufemesvêm do nome do arquivo (RDSP2401.dbc→ SP, 2024, mês 1) (tests/unit/sources/datasus_ftp/test_filenames_golden.py;src/omnisus/sources/datasus_ftp/staging.py). munic_resé o município de residência do paciente, com 6 caracteres (Informe SIH 2016-03, p. 1).munic_mové o município do estabelecimento, com 6 caracteres (Informe SIH 2016-03, p. 2).uf_zié o município gestor, com 6 caracteres (Informe SIH 2016-03, p. 1), embora o dicionário o rotule "UF do gestor" (src/omnisus/data/dicionarios/sih_aih_reduzida.yaml).cnesé o código CNES do hospital, com 7 caracteres (Informe SIH 2016-03, p. 3).- O dicionário liga
munic_resemunic_movaaux_municipios.codigo_6;diag_secun,cid_assoecid_mortegravam0000quando não há causa (vocabulários). A importação preserva o comprimento dos códigos publicados; não aplica preenchimento de zeros guiado pelo YAML.
Cobertura e modalidade¶
Arquivos mensais por UF, de janeiro de 2008 em diante, no diretório
/dissemin/publicos/SIHSUS/200801_/Dados, sem diretório preliminar; veja o
catálogo de datasets. Os arquivos RJ, SP e ER, que o mesmo documento
descreve (Informe SIH 2016-03, p. 4–5), são linhas próprias; veja abaixo.
Outras linhas do SIH¶
| Linha | Prefixo | Diretório | Cobertura |
|---|---|---|---|
sih_aih_rejeitada |
RJ |
SIHSUS/200801_/Dados |
2008-01 em diante |
sih_servicos_profissionais |
SP |
SIHSUS/200801_/Dados |
2008-01 em diante |
sih_aih_rejeitada_erro |
ER |
SIHSUS/200801_/Dados |
2011-01 em diante |
sih_aih_reduzida_1992_2007 |
RD |
SIHSUS/199201_200712/Dados |
1992-01 a 2007-12; o diretório Doc dessa era está vazio no servidor |
Os dicionários dessas linhas partem do inventário físico do descritor DBF de uma fixture real (scripts/gen_dicionario.py); o de sih_aih_reduzida_1992_2007, dos descritores de quatro fixtures e do censo de layouts descrito abaixo. Os rótulos de categoria vêm do CNV do TabWin quando o DEF liga o campo e todo valor não branco da fixture é chave do mapa (sources/cnv/vinculos.json); calendários, cadastros e faixas não são copiados. Fica sem rótulos sih_aih_rejeitada_erro (o DEF só liga ano e mês). Em sih_aih_reduzida_1992_2007, ident, sexo, morte, natureza, gestao, semiplen, instru e vincprev têm os rótulos dos CNV que o RD.DEF liga a eles nos três pacotes da era em SIHSUS/200801_/Auxiliar/ (TAB_SIH_199201-199712.zip, TAB_SIH_199801-200307.zip e TAB_SIH_200308-200712.zip), idênticos byte a byte; os SHA-256 estão em evidence/2026-09-29-tab-sih-rd-eras/. Os outros campos categóricos que o RD.DEF liga, como espec, car_int, cobranca e marca_uti, seguem sem rótulo nessa linha. CH e CM (nacionais, desde 2019) e as eras antigas de RJ e SP não estão no catálogo.
De 1992-01 a 2007-12, os arquivos RD lidos (um de RR por mês, AP onde RR falta, e SP e MG nos meses de troca) têm 19 layouts DBF, e o dicionário de sih_aih_reduzida_1992_2007 declara os 89 campos que aparecem em algum deles. Colunas aparecem e somem: us_sh, us_sp, us_sadt, us_ortp e us_sangue existem até 1997-12 (us_rn, de 1994-01 a 1997-12); uti_total, até 1999-12; cod_arq e cont, até 2006-03, menos em 2001; semiplen, de 1995-01 a 1997-12; diag_sec, só em 1997; val_sang, só em 1994-12, mês que não tem val_sangue; cgc_mant, só em 2004-07; cod_seg, de 2004-07 a 2006-03. Numa tabela com vários meses, a coluna que falta num mês fica NULL nas linhas desse mês. O RD.DEF dos três pacotes liga semiplen ("Gestão (95-97)") a GESTAO.CNV, de onde vêm os rótulos, e diag_sec a tabelas CID-9; diag_sec fica sem rótulo, como diag_princ. num_proc é numérico (N) de 1996-01 a 1996-07, e insc_pn e seq_aih5, de 2004-07 a 2006-03; nos outros meses em que existem são texto (C), o tipo que o dicionário declara até a issue #40 decidir. O lake recusa a mudança de tipo de uma coluna com UnsafeSchemaError: gravar RDRR9602 numa tabela que já tem RDRR9506 dá VARCHAR versus BIGINT. Com import_dataset, o lote do escopo recusado é desfeito (os outros escopos do lote saem como failed, código rolled_back) e os lotes seguintes continuam. Os arquivos lidos, com data, tamanho, SHA-256 e layout, estão em evidence/2026-10-01-rd-1992-2007-layouts/.
Em sih_aih_reduzida e sih_aih_rejeitada, CONTRAC.CNV (contracep1 e contracep2) e motbloqueio.cnv (st_mot_blo, só em RJ) abrem com a faixa 00-99, que rotula qualquer código de dois dígitos: um código fora da tabela recebe "Ignorado/não se aplica" ou "NÃO ESPECIFICADO", e não fica sem rótulo.
Armadilhas¶
- Há AIH de tipos diferentes em
ident(Informe SIH 2016-03, p. 1) e um sequencial próprio para a AIH de longa permanência (p. 3). - A consulta
aih_distintasdo notebook compara o número de linhas com o número de valores distintos den_aihantes de qualquer contagem (notebooks/sih_aih_reduzida.py). - Agregar por
mes_cmptconta AIH processadas no mês (Informe SIH 2016-03, p. 1); para contar internações por mês de ocorrência, usedt_inter(p. 2). morte"indica óbito", com 1 algarismo, e o documento não lista os códigos (Informe SIH 2016-03, p. 2); os códigos e rótulos vêm do pacote oficialTAB_SIH.zip, republicado pelo DATASUS em 2026-09-15,RD2008.DEF→MORTES.CNV(src/omnisus/data/dicionarios/sources/cnv/vinculos.json).cid_morteé a CID da morte (Informe SIH 2016-03, p. 3), ecobrancaé o motivo de saída ou permanência (p. 2); os códigos e rótulos decobrancavêm do mesmo pacoteTAB_SIH.zip,RD2008.DEF→SAIDAPERM.CNV— por exemplo, 26 = permanência por mudança de procedimento e 31 = transferência para outro estabelecimento (src/omnisus/data/dicionarios/sources/cnv/vinculos.json).- Os complementos federal e do gestor de serviços hospitalares e profissionais
(
val_sh_fed,val_sp_fed,val_sh_ges,val_sp_ges) estão incluídos no valor total da AIH (Informe SIH 2016-03, p. 4). us_toté o valor total em dólar, não em reais (Informe SIH 2016-03, p. 2).- Vários campos de valor vêm zerados:
val_sadt,val_rn,val_acomp,val_ortp,val_sangue,val_sadtsr,val_transp,val_obsangeval_ped1ac(Informe SIH 2016-03, p. 2). - Também vêm zerados
uti_mes_in,uti_mes_an,uti_mes_al,uti_int_in,uti_int_aneuti_int_al(Informe SIH 2016-03, p. 1); a quantidade de dias de UTI no mês está emuti_mes_to(p. 1). diag_secunvem preenchido com zeros a partir de 201501 (Informe SIH 2016-03, p. 2); os diagnósticos secundários estão emdiagsec1adiagsec9(p. 4), e o dicionário os liga à tabelaaux_cid10, como odiag_princ(RD2008.DEF, linhas 389-406, relacionaDIAGSEC1aDIAGSEC9aDBF/CID10.DBF). Aaux_cid10vem doCID10.DBFdo SIM (ver Vocabulários), não doDBF/cid10.dbfdeTAB_SIH.zip, que o repositório não empacota. O tipo de cada um, emtpdisec1atpdisec9, vem deRD2008.DEF→TP_DIAGSEC.CNV: 1 = preexistente, 2 = adquirido. O0que os arquivos publicam não está na tabela e fica sem rótulo.naturezatem conteúdo só até maio de 2012; a natureza jurídica pela CONCLA está emnat_jur(Informe SIH 2016-03, p. 2).idadedepende decod_idade(Informe SIH 2016-03, p. 2). O pacote oficialTAB_SIH.zip,CNV/IDADEDET.CNV, confirma dias, meses, anos e unidade 5 com deslocamento de 100 anos no domínio detalhado. Os códigos compostos000e999são classificados como inválidos; isso não define uma sentinela global para o campo brutoidade.sexotem 1 caractere (Informe SIH 2016-03, p. 1). A tabela oficialCNV/SEXO.CNVdefine 1 masculino e 2/3 feminino. A aplicação dessas regras exige os escopos e hashes confirmados no contrato; códigos não documentados permanecem desconhecidos.- Os códigos ficam no lake como publicados: o dicionário decodifica rótulos, datas e
idade na exibição, não na importação (
src/omnisus/transforms/dictionaries.py, docstring do módulo;src/omnisus/sources/datasus_ftp/staging.py, que não decodifica). - O texto é lido como
latin-1: cada byte vira o caractere de mesmo valor, evalor.encode("latin-1")devolve os bytes do arquivo. Comcp1252, um único byte 0x90 emaud_justderrubava a importação deRDSP2308(SHA-256eb5d97e8…f3ebb). - Em
aud_justde RD SP de 2022-12 a 2023-12 (13 arquivos, 1.056 valores), os únicos bytes de 0x80 a 0x9F são 0x80, 0x87 e 0x90, que em CP850 são Ç, ç e É:DOA\x80AOé "DOAÇAO",INFORMA\x87oESé "INFORMAçoES",REC\x90Mé "RECÉM". Nenhum outro campo desses arquivos tem byte nessa faixa. Para ler em CP850:valor.encode("latin-1").decode("cp850"). A biblioteca não converte: o dicionário declara uma codificação por arquivo, não por campo.
Em aberto¶
- O que uma linha representa: o documento traz o número da AIH (
n_aih, Informe SIH 2016-03, p. 1), mas não diz que cada linha é uma AIH distinta, e o layout RD não traz o número do Cartão Nacional de Saúde do paciente (p. 1–4). Não trate linhas como pacientes, e compare linhas com valores distintos den_aih(consultaaih_distintas) antes de contar AIH. - Se uma internação longa aparece em mais de uma linha: o documento traz o tipo da AIH
e o sequencial de longa permanência (p. 1 e p. 3), mas não diz como uma internação se
divide em AIH. Não conte internações como linhas sem olhar
ident,seq_aih5en_aihnos seus dados. - Se o mês do arquivo (
mes) é sempre igual ames_cmpt: o documento não explica o nome do arquivo. Compare as duas colunas antes de supor. - Os códigos de
ident: o informe não os lista. Para idade e sexo, a auditoria de 2026-09-14 acrescentou o pacote oficial TAB_SIH: unidade 5 usa 100 + quantidade no domínio confirmado; sexo 1 é masculino e 2/3 feminino. A consultacampo_mortedo notebook mostra os valores publicados. complex,ident,instru,natureza,raca_cor,sexoevincprevmantêm o mapa manual: o CNV de cada um reivindica um código duas vezes (faixa e valor explícito), e o gerador rejeita esse caso (src/omnisus/data/dicionarios/sources/cnv/vinculos.json,sem_cnv).- O comprimento do código de município nos dados: o documento declara 6 caracteres (p. 1–2). Confira nos seus dados antes de juntar com outra base.
- Se o layout vale para arquivos processados depois de 2016-03: o documento é o informe desse processamento (p. 1).
Como usar¶
import omnisus as sus
alvo = "ducklake:./data/raw/omnisus.ducklake" # o padrão de Lake.local() e load()
escopos = sus.available("sih_aih_reduzida", years=[2024], ufs=["RR"], months=[1], refresh=True)
relatorio = sus.import_dataset(
"sih_aih_reduzida", scopes=escopos, target=alvo, policy="skip_same", run_id="sih-rr-2024-01"
)
with sus.LakeReader(alvo) as leitor:
print(leitor.connect().sql("SELECT ano, mes, count(*) AS aih FROM lake.sih_aih_reduzida GROUP BY ALL").pl())
Passo a passo com análise e procedência:
notebooks/sih_aih_reduzida.py
.
Fontes¶
- Disseminação de Informações do Sistema de Informações Hospitalares (SIH), Informe
Técnico referente ao processamento 2016-03 (
IT_SIHSUS_1603.pdf), Ministério da Saúde / Secretaria de Gestão Estratégica e Participativa / DATASUS: ftp://ftp.datasus.gov.br/dissemin/publicos/SIHSUS/200801_/Doc/IT_SIHSUS_1603.pdf — consultado em 2026-09-10; SHA-2561e89d5f2cc41420385d7e30ba5541a387912ab3a0efb167d39def74502076220, conferido de novo em 2026-09-13. Registro:src/omnisus/data/dicionarios/sources/registry.json. - Catálogo gerado do registro da biblioteca: Datasets.
Detalhes técnicos¶
Linha de comando¶
omnisus inventory sih_aih_reduzida --refresh
omnisus import sih_aih_reduzida --plan inventory --years 2020-2024 --ufs RR
As importações acrescentam linhas a lake.sih_aih_reduzida. Ao terminar, a importação
devolve um ImportReport; o estado de uma transação interrompida aparece em
ImportAbortedError. Veja
resultados e transações.
Dicionário¶
As definições de campo, os metadados de chave estrangeira e as regras de decodificação
ficam em src/omnisus/data/dicionarios/sih_aih_reduzida.yaml. A ingestão preserva os valores e tipos do DBF, normaliza nomes de colunas e
acrescenta as partições e a modalidade de origem. O YAML descreve campos e
apresentação; ele não comanda coerções na ingestão. Colunas não listadas no YAML
também são preservadas. A validação do dicionário, sozinha, não
certifica todos os registros recebidos.
Auditoria do contrato analítico (2026-09-14)¶
Regras, divergências, inventário e limites de aplicabilidade estão na
auditoria reproduzível.
Ela registra o snapshot 5, os hashes das publicações, schemas e consultas agregadas.
A aplicabilidade se restringe aos escopos confirmados; uma edição documental não
valida automaticamente toda a série histórica. A procedência de arquivo é
consultada por LakeReader.publications() no mesmo snapshot.
Extensão de escopo (2026-09-14)¶
A regra 1.1.0 inclui o arquivo final RDRR2301.dbc, identificado pelo SHA-256
e9f717ff378477a883d19f733efe8409aee7f7795a027584b9f383364264d8e4.
As 4.734 linhas foram auditadas integralmente para idade, sexo e datas.
Códigos fora do domínio documentado permanecem sem interpretação exata.
Veja relatório e reprodução.