basedosdados / basedosdados/pipelines

[databug] br_ms_sih: linhas fantasma (id_aih vazio, valor 0) em 2024-03 e 2024-04 nas duas tabelas

Open
#1,634 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.