DEV Community

Cover image for BigQuery SQL
Henrique Vital
Henrique Vital

Posted on

BigQuery SQL

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; 
Enter fullscreen mode Exit fullscreen mode

Explicação:

  • ROW_NUMBER(): Atribui uma numeração a cada linha dentro de uma partição (nesse caso, por ano de lançamento).
  • AVG() com OVER: 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; 
Enter fullscreen mode Exit fullscreen mode

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; 
Enter fullscreen mode Exit fullscreen mode

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 o UNION 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; 
Enter fullscreen mode Exit fullscreen mode

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; 
Enter fullscreen mode Exit fullscreen mode

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; 
Enter fullscreen mode Exit fullscreen mode

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; 
Enter fullscreen mode Exit fullscreen mode

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`; 
Enter fullscreen mode Exit fullscreen mode

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; 
Enter fullscreen mode Exit fullscreen mode

Explicação:

  • Funções de data/tempo como EXTRACT, DATE_DIFF e TIMESTAMP_TRUNC ajudam a analisar tendências temporais e criar relatórios.

😊

Top comments (0)