Padrões de relatórios do mundo real
Implemente painéis clássicos: curvas de retenção, top-N por categoria e criação de sessões — tudo com funções de janela.
Padrões de relatórios do mundo real é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Padrão: Top-N por grupo
Os 3 principais pedidos por usuário:
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;Padrão: totais acumulados
Receita acumulada ao longo do tempo:
SELECT day, revenue,
SUM(revenue) OVER (ORDER BY day) AS running_total
FROM daily_revenue;Padrão: primeira ocorrência
Primeira vez que cada usuário realizou cada ação:
SELECT user_id, action, MIN(ts) AS first_at
FROM events
GROUP BY user_id, action;
-- Or with window functions for full row:
WITH firsts AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id, action ORDER BY ts) AS rn
FROM events
)
SELECT * FROM firsts WHERE rn = 1;Padrão: retenção por coorte
Usuários agrupados pela semana de cadastro, com retenção na semana N:
WITH cohorts AS (
SELECT id AS user_id, date_trunc('week', created_at) AS cohort_week
FROM users
),
activities AS (
SELECT user_id, date_trunc('week', ts) AS active_week FROM events
)
SELECT c.cohort_week,
(a.active_week - c.cohort_week) / 7 AS week_offset,
COUNT(DISTINCT a.user_id) AS active
FROM cohorts c
JOIN activities a USING (user_id)
WHERE a.active_week >= c.cohort_week
GROUP BY c.cohort_week, week_offset
ORDER BY c.cohort_week, week_offset;Padrão: análise de funil
Quantos usuários chegam a cada etapa:
SELECT
COUNT(*) AS signed_up,
COUNT(*) FILTER (WHERE first_login_at IS NOT NULL) AS logged_in,
COUNT(*) FILTER (WHERE first_purchase_at IS NOT NULL) AS purchased
FROM users;Padrão: criação de sessões
Agrupar eventos em sessões quando o intervalo for maior que 30 minutos:
WITH gaps AS (
SELECT user_id, ts,
CASE
WHEN ts - LAG(ts) OVER (PARTITION BY user_id ORDER BY ts)
> INTERVAL '30 min'
THEN 1 ELSE 0
END AS new_session
FROM events
)
SELECT user_id, ts,
SUM(new_session) OVER (PARTITION BY user_id ORDER BY ts) AS session_id
FROM gaps;Padrão: período a período
Comparar o mês atual com o anterior:
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_month,
revenue - LAG(revenue) OVER (ORDER BY month) AS delta,
(revenue::FLOAT / NULLIF(LAG(revenue) OVER (ORDER BY month), 0) - 1) * 100 AS pct_change
FROM monthly_revenue
ORDER BY month;Padrão: saída dinamizada
Formato amplo com FILTER:
SELECT user_id,
SUM(amount) FILTER (WHERE month = '2024-01') AS jan,
SUM(amount) FILTER (WHERE month = '2024-02') AS feb,
SUM(amount) FILTER (WHERE month = '2024-03') AS mar
FROM monthly_spend
GROUP BY user_id;Padrão: usuários ativos hoje
DAU/WAU/MAU:
SELECT
COUNT(DISTINCT user_id) FILTER (WHERE ts >= NOW() - INTERVAL '1 day') AS dau,
COUNT(DISTINCT user_id) FILTER (WHERE ts >= NOW() - INTERVAL '7 days') AS wau,
COUNT(DISTINCT user_id) FILTER (WHERE ts >= NOW() - INTERVAL '30 days') AS mau
FROM events;Padrão: preenchimento de lacunas
Dias sem eventos devem mostrar 0, não ficar ausentes:
SELECT day, COALESCE(COUNT(e.id), 0) AS events
FROM generate_series(CURRENT_DATE - 30, CURRENT_DATE, INTERVAL '1 day') AS day
LEFT JOIN events e ON date_trunc('day', e.ts) = day
GROUP BY day
ORDER BY day;Combinando funções de janela para obter insights
Várias colunas de janela em uma única consulta — legível e rápida:
SELECT day, revenue,
LAG(revenue) OVER w AS prev,
AVG(revenue) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS avg_7d,
SUM(revenue) OVER (ORDER BY day) AS running_total
FROM daily_revenue
WINDOW w AS (ORDER BY day)
ORDER BY day;Recapitulação
A maioria dos relatórios usa alguns padrões: top-N, totais acumulados, coortes, funis, criação de sessões, comparações período a período, tabelas dinamizadas e preenchimento de lacunas. Domine esses padrões e você poderá criar qualquer painel de que o SQL precise.
Verificação rápida
Você está criando um relatório com os "5 principais produtos por categoria". Qual padrão idiomático de SQL deve usar?
Perguntas Frequentes
A aula “Padrões de relatórios do mundo real” é grátis?
Sim — o texto completo de “Padrões de relatórios do mundo real” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Padrões de relatórios do mundo real”?
Implemente painéis clássicos: curvas de retenção, top-N por categoria e criação de sessões — tudo com funções de janela. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Padrões de relatórios do mundo real”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Cláusulas de quadro: ROWS vs RANGE
- Lag/Lead com janelas de quadro
- Agrupamento em faixas com NTILE e Cume_Dist
- Padrões de relatórios do mundo real