Aqui está uma coleção de consultas avançadas em SQL, incluindo técnicas poderosas como funções de janela, manipulação de strings, consultas recursivas, otimização e exemplos específicos de BigQuery. Esses exemplos são úteis para resolver problemas complexos em projetos reais.
1. Funções de janela (Window Functions)
As funções de janela são ótimas para calcular agregações em subconjuntos de dados sem perder os detalhes linha a linha.
-- Exemplo: Classificar filmes por avaliação (rating) dentro de cada ano de lançamento SELECT title, release_year, rating, ROW_NUMBER() OVER (PARTITION BY release_year ORDER BY rating DESC) AS rank FROM netflix; -- Exemplo: Calcular a média acumulada de avaliações SELECT title, release_year, rating, AVG(rating) OVER (PARTITION BY release_year ORDER BY release_year ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS media_acumulada FROM netflix;
Explicação:
-
ROW_NUMBER()
: Atribui uma numeração a cada linha dentro de uma partição (nesse caso, por ano de lançamento). -
AVG()
comOVER
: Calcula uma média acumulada considerando as linhas anteriores dentro da mesma partição.
2. Manipulação de Strings
-- Exemplo: Dividir nomes dos filmes e extrair a primeira palavra SELECT title, SPLIT(title, ' ')[OFFSET(0)] AS primeira_palavra FROM netflix; -- Exemplo: Buscar títulos que começam com "The" SELECT title FROM netflix WHERE title LIKE 'The%'; -- Exemplo: Substituir espaços por traços SELECT title, REPLACE(title, ' ', '-') AS titulo_formatado FROM netflix;
Explicação:
-
SPLIT()
: Divide strings com base em um delimitador, útil para extração de partes. -
LIKE
: Permite buscas com padrões. -
REPLACE()
: Substitui partes específicas de uma string.
3. Consultas Recursivas
Consultas recursivas ajudam a resolver problemas hierárquicos, como árvores ou cadeias.
-- Exemplo: Montar uma hierarquia fictícia de categorias de filmes WITH RECURSIVE categorias AS ( SELECT id, nome_categoria, id_categoria_pai FROM categorias_filmes WHERE id_categoria_pai IS NULL -- Começa pela raiz UNION ALL SELECT c.id, c.nome_categoria, c.id_categoria_pai FROM categorias_filmes c INNER JOIN categorias cat ON c.id_categoria_pai = cat.id ) SELECT * FROM categorias;
Explicação:
-
WITH RECURSIVE
: Define uma consulta que se auto-referência para explorar estruturas hierárquicas. - A consulta base (
WHERE id_categoria_pai IS NULL
) identifica a raiz, e oUNION ALL
permite que as subcategorias sejam adicionadas.
4. Otimização com Indexes e Subconsultas CTE
Usar índices e dividir consultas em etapas pode melhorar a eficiência.
-- Exemplo: Calcular a receita total por gênero usando uma CTE WITH receita_por_genero AS ( SELECT genero, SUM(receita) AS total_receita FROM filmes GROUP BY genero ) SELECT genero, total_receita FROM receita_por_genero WHERE total_receita > 1000000;
Explicação:
-
WITH
: Cria uma consulta temporária reutilizável (CTE) para tornar o código mais limpo e eficiente. - Filtragem em
total_receita > 1000000
ocorre somente após o agrupamento.
5. Consultas BigQuery Avançadas
BigQuery usa SQL padrão, mas com recursos específicos para grandes volumes de dados e análises avançadas.
Exemplo 1: Análise de logs com ARRAYs e STRUCTs
-- Dataset fictício: Análise de cliques em anúncios SELECT user_id, ARRAY_AGG(STRUCT(ad_id, click_time)) AS cliques FROM `projeto.dataset.logs_cliques` GROUP BY user_id;
Explicação:
-
ARRAY_AGG
: Agrupa os registros em um array, mantendo múltiplos cliques por usuário. -
STRUCT
: Permite armazenar colunas associadas dentro do array.
Exemplo 2: Análise de Tabelas Particionadas
BigQuery funciona bem com tabelas particionadas, o que melhora o desempenho em consultas específicas.
-- Consultar apenas partições recentes (últimos 7 dias) SELECT user_id, COUNT(*) AS total_cliques FROM `projeto.dataset.logs_cliques` WHERE _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) GROUP BY user_id;
Explicação:
-
_PARTITIONTIME
: Coluna especial usada em tabelas particionadas para identificar partições. - Limitar as partições reduz o custo da consulta.
Exemplo 3: Funções Analíticas com Geolocalização
-- Exemplo: Identificar o país mais frequente de acesso para cada usuário SELECT user_id, APPROX_TOP_COUNT(country, 1) AS pais_mais_frequente FROM `projeto.dataset.logs_acessos` GROUP BY user_id;
Explicação:
-
APPROX_TOP_COUNT
: Função otimizada para identificar valores mais frequentes em grandes conjuntos de dados.
Exemplo 4: Exploração de JSON em BigQuery
-- Exemplo: Extrair dados estruturados de uma coluna JSON SELECT JSON_VALUE(payload, '$.user.id') AS user_id, JSON_VALUE(payload, '$.user.name') AS user_name FROM `projeto.dataset.logs_api`;
Explicação:
-
JSON_VALUE
: Extrai valores de uma string JSON com base em um caminho especificado. - Ideal para logs de APIs ou dados semiestruturados.
6. Consultas de Data e Tempo
-- Exemplo: Agrupar por dia da semana SELECT EXTRACT(DAYOFWEEK FROM data_acesso) AS dia_semana, COUNT(*) AS total_acessos FROM acessos GROUP BY dia_semana ORDER BY total_acessos DESC; -- Exemplo: Encontrar a diferença em dias entre duas datas SELECT user_id, DATE_DIFF(data_fim, data_inicio, DAY) AS dias_diferenca FROM acessos; -- Exemplo: Criar intervalos de tempo customizados SELECT TIMESTAMP_TRUNC(data_acesso, HOUR) AS hora, COUNT(*) AS acessos_por_hora FROM acessos GROUP BY hora ORDER BY hora;
Explicação:
- Funções de data/tempo como
EXTRACT
,DATE_DIFF
eTIMESTAMP_TRUNC
ajudam a analisar tendências temporais e criar relatórios.
😊
Top comments (0)