Antes de começar, garanta que você tenha:
- Python 3.10+ instalado;
makedisponível no terminal;- ambiente local macOS/Linux (ou equivalente com suporte a
venv).
Dependências Python usadas no projeto:
dbt-coredbt-sqlite
Este repositório simula uma primeira camada raw de um data lake, alimentada por eventos CDC de um sistema transacional. Os dados representam crianças, disciplinas, prescrições de carga horária por disciplina e agendas semanais recorrentes. A Genial precisa construir uma métrica de taxa de agendamento diária por criança e disciplina.
Construir uma pipeline analítica local usando dbt + SQLite. A tabela final deve permitir responder:
Para cada criança, disciplina e dia, qual é a taxa de agendamento em relação à carga horária prescrita validada?
Definição base esperada para a métrica:
scheduling_rate = horas semanais agendadas da disciplina / horas semanais prescritas da disciplina
Ou seja, a taxa compara o que foi agendado na semana para uma disciplina com a prescrição clínica semanal da mesma disciplina.
As regras de implementação (validade temporal, status, deduplicação CDC, distribuição diária e grain final) continuam parte do exercício. Queremos avaliar clareza de modelagem, arquitetura, testes, SQL e comunicação de trade-offs.
O uso de IA é permitido. Pedimos transparência para informar onde você usou IA.
Para avaliação, esperamos:
- código funcional rodando fim a fim no ambiente local;
- comandos principais passando (
make debug,make seed,make build,make test); - capacidade de explicar, na conversa síncrona, o que foi implementado;
- clareza sobre os trade-offs das decisões tomadas;
- justificativa do modelo arquitetural escolhido para resolver o problema.
- investimento de tempo de até 3 horas. Se não der tempo de concluir tudo, documente no README o que você priorizou, as decisões tomadas, até onde implementou e o que faria com mais tempo.
Fluxo recomendado (um comando):
make allFluxo passo a passo:
make setup
make debug
make seed
make build
make testPara ver os comandos com descrição:
make helpPara validar pré-requisitos antes da instalação:
make check- Guia prático para conduzir a solução: docs/guia-do-candidato.md
- Dicionário da camada raw (conceitos, colunas, padrões e relacionamentos): docs/raw-data-dictionary.md
Este repositório contém:
- setup local com dbt + SQLite;
- seeds simulando eventos CDC;
- camada inicial
models/raw/; - testes básicos de exemplo.
Este repositório não entrega:
- definiar as camadas de transformação além da raw;
- tabela final da métrica;
- definição fechada de
scheduling_rate.
Essas decisões fazem parte do exercício.
Você deve propor a arquitetura de transformação a partir da camada raw.
O importante é documentar suas decisões.
A entrega final deve conter uma tabela ou view que permita analisar a taxa de agendamento diária por criança e disciplina.
Considere que:
- os dados raw simulam CDC;
- podem existir múltiplos eventos para a mesma entidade;
- eventos com
op = Drepresentam deleção; - workloads possuem status;
- schedules possuem status;
- workloads e schedules possuem validade temporal;
- schedules são semanais por dia da semana e horário;
- workloads são prescrições semanais por criança e disciplina.
Você deve decidir e documentar:
- como obter o estado atual das entidades;
- como tratar updates posteriores;
- como tratar deletes;
- como tratar workloads
draftoucancelled; - como tratar schedules
cancelledoupaused; - como distribuir uma carga horária semanal em uma meta diária;
- se fins de semana entram ou não;
- como lidar com schedule sem workload validada;
- como lidar com workload validada sem schedule;
- qual é o grain final.
Não existe uma tabela de calendário pronta.
Se precisar expandir datas, você pode usar uma CTE recursiva em SQLite.
Exemplo:
with recursive calendar(date_day) as (
select date('2026-05-01')
union all
select date(date_day, '+1 day')
from calendar
where date_day < date('2026-05-31')
)
select
date_day,
case strftime('%w', date_day)
when '0' then 'sunday'
when '1' then 'monday'
when '2' then 'tuesday'
when '3' then 'wednesday'
when '4' then 'thursday'
when '5' then 'friday'
when '6' then 'saturday'
end as weekday
from calendarVamos avaliar as decisões tomadas e a clareza na comunicação das mesmas na conversa sincrona.
- Como você implementou o cálculo de
scheduling_rate(horas semanais agendadas / horas semanais prescritas) e quais premissas adotou? - Qual é o grain da tabela final?
- Como você transformou uma prescrição semanal em uma meta diária?
- Fins de semana entram na métrica?
- Como schedules cancelados ou pausados são tratados?
- Como workloads em
draftoucancelledsão tratados? - Como eventos CDC duplicados ou atualizações posteriores são tratados?
- Como deletes são tratados?
- Quais testes você adicionou e por quê?
- O que você melhoraria se tivesse mais tempo?
- Você usou IA? Se sim, onde usou e como validou?
| Critério |
|---|
| Clareza da definição da métrica |
| Arquitetura em camadas |
| Correção SQL e tratamento temporal |
| Tratamento de CDC/deduplicação |
| Testes de dados/unitários |
| README, trade-offs e comunicação |
- Não usar serviços externos.
- Não depender de BigQuery, Dataform, Postgres ou Docker obrigatório.
- A solução deve rodar localmente com SQLite.
- O tempo esperado é de 2 a 3 horas.
- O tempo que você deve investir nesse challenge não deveria ser de mais de 3 horas.
- Caso passe disso e você não tenha tempo de fazer tudo, escreva no README as considerações do que você faria se tivesse mais tempo.
- O uso de IA é permitido, mas seria interessante nos informar onde você usou.
Os seeds já estão versionados no repositório. Se quiser regenerar dados sintéticos:
python scripts/generate_seed_data.pyObservação: o script acima é opcional e não é necessário para rodar o case.
- Se
make setupfalhar por versão do Python, use Python 3.10+ e tente novamente. - Se
dbt debugfalhar, rodemake cleane depoismake setup. - Se algo ficar inconsistente no ambiente local, rode:
make clean
make allEste starter segue práticas recomendadas de dbt, mantendo o escopo do desafio propositalmente aberto:
profiledo projeto alinhado comprofiles.ymllocal e execução viaDBT_PROFILES_DIR=..- Testes de dados em
schema.yml+ teste singular emtests/, com semântica de “retornar linhas inválidas”. - Uso de testes genéricos nativos (
not_null,unique,accepted_values) eaccepted_valuesno formatoarguments(compatível com versões atuais do dbt). - Separação clara entre camada raw inicial e camadas analíticas futuras, sem antecipar regras de negócio da métrica.