basedosdados / basedosdados/pipelines
[databug] br_ms_sih: linhas fantasma (id_aih vazio, valor 0) em 2024-03 e 2024-04 nas duas tabelas
- Dominant language
- Python
- Stars
- 49
- Forks
- 22
- Avg merge
- 19h 31m
- Merged PRs (30d)
- 165
Description
### Tabela afetada
`br_ms_sih.aihs_reduzidas` e `br_ms_sih.servicos_profissionais`
### Descrição do problema nos dados
Nas competências **2024-03 e 2024-04**, as duas tabelas contêm um grande volume de "linhas fantasma": registros com `id_aih` NULL/vazio, sem datas, sem procedimento e com valor 0 — que não representam internações nem atos profissionais reais e praticamente **dobram a contagem de linhas** desses meses.
| Tabela | Mês | Linhas totais | Linhas fantasma | % do mês |
|---|---|---|---|---|
| `aihs_reduzidas` | 2024-03 | 2.269.227 | **1.099.320** | 48% |
| `aihs_reduzidas` | 2024-04 | 2.318.687 | **1.129.797** | 49% |
| `servicos_profissionais` | 2024-03 | 31.326.831 | **15.317.333** | 49% |
| `servicos_profissionais` | 2024-04 | 31.867.426 | **15.660.694** | 49% |
Características das linhas fantasma (verificadas em 2026-07-06):
- `aihs_reduzidas`: um único valor distinto de `id_aih` (vazio), `SUM(valor_aih) = 0`, nenhuma linha com `data_internacao` preenchida.
- `servicos_profissionais`: `SUM(valor_ato_profissional) = 0`, zero procedimentos distintos.
- Nas competências 2024-01, 2024-02 e 2024-05 a 2024-10, a contagem de linhas com `id_aih` vazio é **zero** nas duas tabelas — o artefato é exclusivo de 2024-03/04.
### Evidência
```sql
SELECT ano, mes,
COUNT(*) AS total,
COUNTIF(id_aih IS NULL OR id_aih = '') AS fantasmas,
COUNT(DISTINCT IF(id_aih IS NULL OR id_aih = '', COALESCE(id_aih, ''), NULL)) AS ids_distintos_fantasma,
ROUND(SUM(IF(id_aih IS NULL OR id_aih = '', valor_aih, 0)), 2) AS soma_valor_fantasma,
COUNTIF((id_aih IS NULL OR id_aih = '') AND data_internacao IS NOT NULL) AS fantasma_com_data
FROM `basedosdados.br_ms_sih.aihs_reduzidas`
WHERE ano = 2024 AND mes IN (3, 4)
GROUP BY ano, mes ORDER BY mes;
-- 2024-03: total=2269227 | fantasmas=1099320 | ids_distintos=1 | soma_valor=0 | com_data=0
-- 2024-04: total=2318687 | fantasmas=1129797 | ids_distintos=1 | soma_valor=0 | com_data=0
```
```sql
SELECT ano, mes,
COUNT(*) AS total,
COUNTIF(id_aih IS NULL OR id_aih = '') AS fantasmas,
ROUND(SUM(IF(id_aih IS NULL OR id_aih = '', valor_ato_profissional, 0)), 2) AS soma_valor_fantasma,
COUNT(DISTINCT IF(id_aih IS NULL OR id_aih = '', id_procedimento_principal, NULL)) AS proc_distintos_fantasma
FROM `basedosdados.br_ms_sih.servicos_profissionais`
WHERE ano = 2024 AND mes IN (3, 4)
GROUP BY ano, mes ORDER BY mes;
-- 2024-03: total=31326831 | fantasmas=15317333 | soma_valor=0 | proc_distintos=0
-- 2024-04: total=31867426 | fantasmas=15660694 | soma_valor=0 | proc_distintos=0
```
Impacto para quem consome: contagens de internações/atos (`COUNT(*)`) saem ~2x nesses meses, e qualquer média por linha (ticket médio, taxa de óbito, permanência média etc.) sai diluída pela metade. As somas de valores não são afetadas (as linhas fantasma valem 0), o que torna o defeito fácil de passar despercebido.
### Referências
- Fonte original: [Produção Hospitalar (SIH/SUS) – DATASUS](https://datasus.saude.gov.br/acesso-a-informacao/producao-hospitalar-sih-sus/)
- Dataset na BD: https://basedosdados.org/dataset/ff933265-8b61-4458-877a-173b3f38102b
- Defeito independente nas mesmas tabelas (competências carregadas em dobro), reportado em issue separada: https://github.com/basedosdados/pipelines/issues/1633
Sou consumidor do dataset e fico à disposição para verificações adicionais que ajudem na correção.
Contributor guide
Research direction
Start by running the provided SQL checks against br_ms_sih.aihs_reduzidas and br_ms_sih.servicos_profissionais for competencies 2024-03 and 2024-04, then compare those records with the DATASUS source and the pipeline entry point that loads these tables. Done means determining the ingestion cause, preventing the phantom rows, and validating corrected counts for both months without affecting valid records.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- sql
- Domain
- data-engineering, databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 42/100