Você está na página 1de 188

The Rise of SQL

Guided Training

Ricardo Sallin
Data Academy B2W DIGITAL

Ricardo Sallin

Americanas: mar’16
Origem: Centrão de SP
Formação: Processamento de Dados (Fatec-SP)
Antes da Americanas: Santander, Grupo Pão de Açúcar, Oi
Interesses: Projeto Pizzarias do Mundo
Data Academy B2W DIGITAL

Raphael Mantilha

B2W: jan/2017
Origem: Campinas/SP
Formação: Engenharia de Computação (PUC-Campinas)
Antes da Americanas: CI&T
Interesses: Jogos/Animes/Filmes
Data Academy B2W DIGITAL

AGENDA

Aula 1 Fundamentos do Relacional; Conhecendo a bee; A Linguagem SQL

Aula 2 Exercício com dados de vendas; Cuidados com queries; Recursos da bee

Aula 3 Chave Estrangeira; Diagrama de Dados; Joins: Inner e Outer

Aula 4 Subqueries e With: dividir para conquistar; Criando um monitoramento diário; Além da Bee
Data Academy B2W DIGITAL

Aula 1

https://universoamericanas.neolude.com.br/
PresentialMeeting/ConfirmPresence/Nzk0O
Dc6NTMzMjg=
Data Academy B2W DIGITAL

Fundamentos do
Relacional
Data Academy B2W DIGITAL

Fundamentos do SQL - Teoria Relacional

Edgar Codd, Chris Date, Peter Chen (e outros…)


década de 1970

Pesquisadores na IBM
Matemática da computação

Pares ordenados > trios > ... > tuplas


Edgar Codd Chris Date Peter Chen
★ 1923-2003 ★ 1941 ★ 1947
(x,y) ... (a,b,c,d,e,f,…) ✞
Data Academy B2W DIGITAL

Fundamentos do SQL - Teoria Relacional

Bancos de Dados contêm Tabelas


Tabelas contêm Registros (ou linhas, observações, etc): são as tuplas do Codd/Date
Linhas contêm Campos (ou colunas, variáveis, etc)
Colunas contêm Dados atômicos (individuais)
Data Academy B2W DIGITAL

Fundamentos do SQL - Teoria Relacional

Dados pertencem a tipos (ou domínios): Nomes de pessoas, de países, de cidades, quantidades, valores, datas...
Tabelas têm chaves primárias (ou Primary Key, PK, etc): é o “RG” de cada linha na tabela
Data Academy B2W DIGITAL

Fundamentos do SQL - Arquitetura

SELECT campo1, campo2...


FROM tabela1
WHERE campo1 = valor1;

Cliente Servidor

é o seu computador, que envia uma query (consultas) ao Computador de alta capacidade, que comporta o BD e
Servidor, seja através de um sistema (Bee, Vegas e outros) outros sistemas. Responde as queries com dados (outras
ou diretamente tabelas)
Data Academy B2W DIGITAL

Fundamentos do SQL - Principais Sistemas em Uso

(1989)
(1980) (1989)
Alternativa da Microsoft,
Sinônimo de BD, muito Importante nome do software livre:
também muito usado
consolidado no mercado “Os elefantes nunca esquecem”

(1996)
Principal BD de software livre (2000)
(1992)
Levou o conceito de BD aos SQL local em arquivo!
PCs, com interface gráfica (quase um Excel SQL)

(2010)
Plataforma muito poderosa: inclui o Bigquery
(que usa SQL) entre muitas outras ferramentas
Data Academy B2W DIGITAL

Conhecendo a
bee Data Platform
Data Academy B2W DIGITAL

bee Data Platform: Plataforma de Big Data da B2W

GCP (Google Cloud Platform): é o ecossistema fornecido pelo Google

BigQuery: é a principal ferramenta de SQL dentro do GCP

Time bee: responsável pela plataforma

Acompanhe em http://bee.b2w

Se tiver interesse aprenda mais no self-training

Encontre datasets disponíveis no Explorer


Data Academy B2W DIGITAL

Sistemas, Explorar, criar e


Integrar sistemas,
aplicações e compartilhar datasets, Pessoas
aplicações e APIs
APIs importar e exportar dados

Coleta dados dos diversos sistemas da B2W em Datasets

Grandes tabelas, que usam as tecnologias e boas práticas do Big Data

Muita performance
Data Academy B2W DIGITAL

Organização, projetos e recursos

“Mas Sallin, e se eu não tiver acesso?” No pacote já vem:

É só abrir um chamado no BHD, digitar bee e clicar na pastinha IAM: ● acesso à plataforma pra você conseguir entrar

● acesso ao projeto b2w-bee-quickstart, para


alocar custos (durante o treinamento)

● acesso de leitura aos dados do projeto


b2w-bee-analytics, que contém os datasets
oficiais da B2W entre outros
Data Academy B2W DIGITAL

Exercício:
vamos fazer login?
Data Academy B2W DIGITAL

Entre na bee: console.cloud.google.com/bigquery

Tudo na bee fica nos projetos: cada área tem o seu

Selecione um projeto para alocar custos


Data Academy B2W DIGITAL

Entre na bee: console.cloud.google.com

Tudo na bee fica nos projetos: cada área tem o seu

Selecione um projeto para alocar custos


Data Academy B2W DIGITAL

Agora selecionar
o seu projeto
Data Academy B2W DIGITAL

Lembre-se! Você pode usar o projeto


bee Quickstart para alocar custos
enquanto não tem o da sua área ou o seu
O ideal é sempre usar o da sua área
Data Academy B2W DIGITAL

O BigQuery fica no menu


principal do GCP, na seção
BigData

Para facilitar você pode


fixá-lo no topo da lista
Data Academy B2W DIGITAL

Exercício:
acessar o Bigquery
Data Academy B2W DIGITAL

Inclua os dados dos projetos


clicando no +:

b2w-bee-analytics
seller-analytics-prd
Data Academy B2W DIGITAL

Inclua os dados dos projetos


clicando no +:

b2w-bee-analytics
seller-analytics-prd
Data Academy B2W DIGITAL

Clique em Adicionar Dados e em


Fixar Projeto, depois procure o
projeto pelo nome ou código bee:
Data Academy B2W DIGITAL

Clique em Adicionar Dados e em Fixar


Projeto, depois procure o projeto pelo
nome ou código bee:
Data Academy B2W DIGITAL

Exercício:
fixar um projeto
Data Academy B2W DIGITAL

Estes são Projetos: cheios de dados pra gente usar!

Com o projeto fixado, é só localizar Estes são Datasets do projeto b2w-bee-analytics


os dados no painel esquerdo:

Estas são Tabelas do dataset clean_freight


Data Academy B2W DIGITAL

Aproveite pra ver também o Esquema (lista de campos) da tabela,


e uma Visualização (de graça) das primeiras linhas

Conheça cada uma das colunas e como elas interagem


Data Academy B2W DIGITAL

bee-explorer.internal.b2w.io
Data Academy B2W DIGITAL

A Linguagem SQL
Data Academy B2W DIGITAL

Structured Query Language


A linguagem padrão dos Bancos de Dados Relacionais (ANSI / ISO)

SELECT campo1, campo2... SELECT *


FROM tabela1 FROM tabela1;
WHERE campo1 = valor1;
Data Academy B2W DIGITAL

SELECT especifica os campos

FROM escolhe a tabela

WHERE especifica as condições


● construa castelos com AND, OR e ()
● use NOT pra inverter condições
Data Academy B2W DIGITAL

Vamos começar o nosso primeiro Select!!

Primeiro a estrutura básica com as palavras-chave...

SELECT especifica os campos (* pega tudo)


FROM escolhe a tabela
WHERE especifica as condições
ORDER BY especifica a ordem

select *
from
Digite
where no seu
Bigqu
ery
Data Academy B2W DIGITAL

...depois especificar a tabela de origem...

SELECT especifica os campos (* pega tudo)


FROM escolhe a tabela
WHERE especifica as condições
ORDER BY especifica a ordem

select *
from `seller-analytics-prd.clean_seller.cadastro`
where

`
São crases ( ), e não aspas!
Vamos entender isso já já :)
Data Academy B2W DIGITAL

...colocar um filtro...

SELECT especifica os campos (* pega tudo)


FROM escolhe a tabela
WHERE especifica as condições
ORDER BY especifica a ordem

select *
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'

Aqui é aspas mesmo ( )


'
Vamos entender isso já já :)
Data Academy B2W DIGITAL

...e uma ordenação!

SELECT especifica os campos (* pega tudo)


FROM escolhe a tabela
WHERE especifica as condições
ORDER BY especifica a ordem

select *
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
order by analista, nome_parceiro
Data Academy B2W DIGITAL

Você ainda pode colocar comentários pra


ajudar a explicar o que está acontecendo
(pros amiguinhos ou pra você mesmx!)

SELECT especifica os campos (* pega tudo)


FROM escolhe as tabelas
WHERE especifica as condições
ORDER BY especifica a ordem

Agora é só clicar no botão Executar


(ou Run) e ver o resultado aparecer!
select * -- pega todos os campos
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
order by analista, nome_parceiro
Data Academy B2W DIGITAL

Oba, funcionou!!

O resultado da sua
primeira query na bee!!
Data Academy B2W DIGITAL

Conhecendo a Linguagem SQL

“Mas Sallin, tem que digitar tudo?”

Com o recurso Consultar Tabela,


ele monta a base do select sozinho!
Data Academy B2W DIGITAL

“Mas Sallin, e se mesmo assim eu errar?”

⤏ Nomes de tabelas ou campos inexistentes;


Não tem problema! ⤏ Palavras-chave erradas ou fora do lugar;
Com o Validador ele mostra os erros ⤏ `Aspas` sobrando ou faltando;
⤏ E outros!
Data Academy B2W DIGITAL

“Mas Sallin, e se mesmo assim eu errar?”

⤏ Nomes de tabelas ou campos inexistentes;


Não tem problema! ⤏ Palavras-chave erradas ou fora do lugar;
Com o Validador ele mostra os erros ⤏ `Aspas` sobrando ou faltando;
⤏ E outros!
Data Academy B2W DIGITAL

E voltando à
Linguagem SQL...
Data Academy B2W DIGITAL

Conhecendo a Linguagem SQL

AS renomeia campos, trocando o nome por um “alias”

select analista, nome_parceiro, id_parceiro as cnpj,


nome_municipio as cidade, id_estado, id_pais,
dt_primeira_venda_comercial comecou_em
from `b2w-bee-analytics.clean_seller.cadastro`
order by nome_parceiro;

E o próprio AS não é obrigatório. É só colocar o “alias” (novo nome) diretamente depois do campo!
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

IN busca itens em um conjunto


Equivalente a várias condições WHERE em um mesmo comando

select analista, nome_parceiro, id_parceiro as cnpj, nome_municipio as cidade,


id_estado, id_pais
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
and situacao = 'Ativo'
and id_estado in ('RJ', 'ES', 'SP', 'MG')
order by analista, nome_parceiro;
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

Dá pra fazer o mesmo com WHERE ?


Até dá… mas dá mais trabalho:

select analista, nome_parceiro, id_parceiro as cnpj, nome_municipio as cidade,


id_estado, id_pais
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
and situacao = 'Ativo'
and (id_estado = 'RJ' or id_estado = 'ES' or id_estado = 'SP' or id_estado = 'MG')
order by analista, nome_parceiro;

Atenção: aqui usamos OR juntamente com AND.


Nesses casos, procure sempre colocar todos os OR entre parênteses,
senão os resultados serão inesperados!
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

BETWEEN busca valores em um intervalo

select analista, nome_parceiro, id_parceiro as cnpj, nome_municipio as cidade,


id_estado, id_pais, dt_primeira_venda as comecou_em
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
and situacao = 'Ativo'
and dt_primeira_venda between '2020-01-01' and '2020-12-31'
order by analista, nome_parceiro;
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

LIKE comparação de texto


Bem mais simples que o Regex, mas ajuda a buscar nomes

select analista, nome_parceiro, id_parceiro as cnpj, nome_municipio as cidade,


id_estado, id_pais, dt_primeira_venda as comecou_em
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
and situacao = 'Ativo'
and lower(nome_parceiro) like '%ele%'
order by analista, nome_parceiro;
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

Exercício: localizar todas as filiais da Olist pelo CNPJ

Podemos usar o Like!

Primeiro descobrimos o início do CNPJ da Olist…


(ele vai trazer outros sellers junto)

select nome_parceiro, id_parceiro as cnpj


from `b2w-bee-analytics.clean_seller.cadastro`
where lower(nome_parceiro) like '%olist%';
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

Exercício: localizar todas as filiais da Olist pelo CNPJ

…e depois usamos esse CNPJ descoberto pra trazer todas as filiais!

select nome_parceiro, id_parceiro as cnpj


from `b2w-bee-analytics.clean_seller.cadastro`
where cast(id_parceiro as string) like '18552346%'
order by 1;
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

DISTINCT retorna itens únicos


Uma forma simples de Group By (que veremos a seguir)

select distinct nome_municipio as cidade, id_estado, id_pais


from `b2w-bee-analytics.clean_seller.cadastro`
where situacao = 'Ativo';
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

GROUP BY cria agrupamentos MÉTRICAS


Colunas de grupo e de métricas Sumarizam as linhas de cada grupo
As colunas de grupo devem ser citadas no Group By sum(), count(), max(), min()...

select id_estado, id_pais, count(nome_parceiro) as qtdSellers


from `b2w-bee-analytics.clean_seller.cadastro`
where situacao = 'Ativo'
group by id_estado, id_pais
order by 3 desc;
Data Academy B2W DIGITAL

E voltando à Linguagem SQL...

HAVING filtra grupos


Um Where especial para o Group By

select id_estado, id_pais, count(nome_parceiro) as qtdSellers


from `b2w-bee-analytics.clean_seller.cadastro`
where situacao = 'Ativo'
group by id_estado, id_pais
having count(nome_parceiro) > 1000
order by 3 desc;
Data Academy B2W DIGITAL

Conhecendo a Linguagem SQL

LIMIT retorna apenas as X primeiras linhas do resultado

select analista, nome_parceiro, id_parceiro as cnpj,


nome_municipio as cidade, id_estado, id_pais,
dt_primeira_venda_comercial comecou_em
from `b2w-bee-analytics.clean_seller.cadastro`
order by nome_parceiro
limit 10;

LIMIT não tem nenhum efeito na quantidade de dados processados. Ele não serve pra isso!
Vamos ver alguns casos em que ele é bastante útil
Data Academy B2W DIGITAL

Revisão: As Principais Palavras-Chave do SQL

SELECT BETWEEN
FROM LIKE
WHERE DISTINCT
ORDER BY GROUP BY
AS HAVING
IN LIMIT
Data Academy B2W DIGITAL

Aula 2

https://universoamericanas.neolude.com.br/
PresentialMeeting/ConfirmPresence/Nzk0O
Dg6NTMzMjg=
Data Academy B2W DIGITAL

AGENDA

Aula 1 Fundamentos do Relacional; Conhecendo a bee; A Linguagem SQL

Aula 2 Exercício com dados de vendas; Cuidados com queries; Recursos da bee

Aula 3 Chave Estrangeira; Diagrama de Dados; Joins: Inner e Outer

Aula 4 Subqueries e With: dividir para conquistar; Criando um monitoramento diário; Além da Bee
Data Academy B2W DIGITAL

Exercício:
Tabela de Vendas
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

Vamos conhecer mais um pouco os dados da B2W?

Desta vez vamos olhar para os dados de vendas!

● `b2w-bee-analytics.evaluated_sales.sales`
● Todos os detalhes de todos os dados de pedidos!

Vamos coletar alguns dados dessa tabela e depois faremos várias mudanças! #variaçõesNoMesmoTema
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE

Vamos começar com a nossa


estrutura básica de queries!!
● Todos os pedidos
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")

Acrescente o filtro de data…


● Todos os pedidos
● das últimas 3 Black Fridays
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT order_id, order_date, round(sum(order_line_total_value), 2) as gmv


FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")

...algumas colunas no Select...

● Todos os pedidos, com data e valor


● das últimas 3 Black Fridays
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT order_id, order_date, round(sum(order_line_total_value), 2) as gmv


FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and delivery_zipcode between '20000000' and '28999999'
group by order_id, order_date;
E pronto! Temos uma bela query pra estudar:
● Todos os pedidos, com data e valor
● das últimas 3 Black Fridays
● com PITs do Harry Potter
● no estado do RJ
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT date(order_date), round(sum(order_line_total_value), 2) as gmv


FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and delivery_zipcode between '20000000' and '28999999'
group by date(order_date);

● Agrupando os pedidos por data


Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT date(order_date) as dataPed,


round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
-- and delivery_zipcode between '20000000' and '28999999'
group by 1
order by 1;

● Pegando Brasil inteiro (comentando o filtro)


● renomeando colunas
● simplificando Group By
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT date(order_date) as dataPed,


round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and payment_status = 'APROVADO'
group by 1
order by 1;

● Filtrando apenas vendas Aprovadas


Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT date(order_date) as dataPed,


round(avg(date_diff(date(delivery_date), date(order_date), DAY)), 2)
as tempoEntrega,
round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and payment_status = 'APROVADO'
group by 1
● Pegando o tempo médio de entrega em dias
order by 1;
● O comando AVG (average) calcula médias
● O comando date_diff calcula a diferença entre duas datas
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT FORMAT_DATE('%Y', date(order_date)) as ano,


date_diff(date(delivery_date), date(order_date), DAY)
as tempoEntrega,
count(distinct order_id) as qtdPedidos,
round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and payment_status = 'APROVADO'
group by 1, 2 ● Criando histograma por ano e tempo de entrega
order by 1, 2; ● não esqueça o Group By!
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT FORMAT_DATE('%Y', date(order_date)) as ano,


case when seller_id is null then '1P' else '3P' end as p,
date_diff(date(delivery_date), date(order_date), DAY)
as tempoEntrega,
count(distinct order_id) as qtdPedidos,
round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and payment_status = 'APROVADO'
group by 1, 2, 3 ● Histograma quebrando também por 1P/3P
● não esqueça o Group By!
order by 1, 2, 3;
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT FORMAT_DATE('%Y', date(order_date)) as ano,


prime_flag, crossborder_flag, fulfillment_flag,
count(distinct order_id) as qtdPedidos,
round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and payment_status = 'APROVADO'
group by 1, 2, 3, 4
order by 1, 2, 3, 4; ● Outros flags úteis para fazer quebras
● não esqueça o Group By!
Data Academy B2W DIGITAL

Exercício: Tabela de Vendas

SELECT FORMAT_DATE('%Y', date(order_date)) as ano,


pit, sku_description,
count(distinct order_id) as qtdPedidos,
round(sum(order_line_total_value), 2) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) in ("2020-11-26", "2019-11-29", "2018-11-23")
and lower(sku_description) like '%harry%potter%'
and payment_status = 'APROVADO'
group by 1, 2, 3
order by 1, 2, 3; ● Pegando detalhes dos produtos
● não esqueça o Group By!
Data Academy B2W DIGITAL

Agora é só sair rodando queries e mais queries!!

Calma!!

No trabalho com queries temos que tomar alguns cuidados!

Senão, você corre os seguintes riscos:


● suas queries vão dar erros e mais erros
● suas queries não encontrarão o resultado que você procura
● suas queries vão demorar muito
● suas queries vão gastar dinheiro a rodo!!
Data Academy B2W DIGITAL

Não confunda


acento crase ( )

``
O primeiro cuidado é com as aspas com acento agudo ( )
Crase ( )
especifica projetos,
datasets e tabelas
São usados dois tipos de aspas na bee:

Um são as crases, usadas apenas nos nomes de tabelas, por ex:

` b2w-bee-analytics.clean_seller.cadastro
`
O outro são as aspas mesmo, usadas pra delimitar valores literais
(texto). Em geral aparecem nos filtros, por ex:
Aspas simples ('' )
where area = 'TOPKA' ou aspas duplas ("")
Nesses casos a bee aceita aspas simples ou duplas especificam valores

Essas crases servem pra manter compatibilidade com versões mais antigas do SQL.
Por isso não mudam!
Data Academy B2W DIGITAL

Outro cuidado é com as letras MAIÚSCULAS e minúsculas

A linguagem SQL é “case INsensitive”, ou seja, tanto faz escrever os comandos em maiúsculas ou minúsculas:

select * from `projeto.dataset.tabela` where campo = 'X'


Select * From `Projeto.Dataset.Tabela` Where Campo = 'X'
Tudo isto funciona!!
SELECT * FROM `PROJETO.DATASET.TABELA` WHERE CAMPO = 'X'
SeLeCt * fRoM `pRoJeTo.dAtAsEt.tAbElA` WhErE cAmPo = 'X'

Porém os dados são “case SENsitive”, ou seja, precisamos seguir conforme está nos dados:

select * from `projeto.dataset.tabela` where area = 'TopKa' Um deles vai trazer os dados:
select * from `projeto.dataset.tabela` where area = 'TOPKA' os outros não trarão nada!!
select * from `projeto.dataset.tabela` where area = 'topka' (mas todos vão funcionar)
Data Academy B2W DIGITAL

Por fim o formato (espaços e quebras de linha)

A linguagem SQL é bem flexível neste ponto. Você pode colocar a sua query como quiser, sem impactos

Exceto no `projeto.dataset.tabela`: Aqui não pode quebrar, tem que ficar tudo junto dentro das crases

select * from `b2w-bee-analytics.clean_seller.cadastro` where area = 'TOPKA' order by analista, nome_parceiro

select select * from


*
from
`b2w-bee-analytics.clean_seller.cadastro` `b2w-bee-analytics.clean_seller.cadastro`
where
area
= where area = 'TOPKA'
'TOPKA'
order
by order by analista, nome_parceiro
analista,
nome_parceiro

Tudo isso funciona!!


Data Academy B2W DIGITAL

Bora testar?
Data Academy B2W DIGITAL

Outro ponto importante é o consumo de dados

A bee é cobrada por


quantidade de dados
processados (GB)

Hoje o preço é:
1 Terabyte (TB) = USD 5

Com o dólar a R$ 5, isso dá mais ou menos


“Ahhh Sallin, mas 1 TB é muita coisa!”
R$ 0,24 / Gigabyte (GB )
Com as tabelas de vendas é muito fácil consumir 1 TB de dados

Mais cuidado ainda com as tabelas de visitas!! Elas são realmente gigantescas
Data Academy B2W DIGITAL

Como limitar as queries? Temos vários recursos pra isso:


● Trazer só os campos que serão usados. Você pode escolher os campos na ordem que quiser!
● Usar filtros (where): trazer apenas o necessário!!! (apenas em campos de particionamento - veremos em breve!)

select analista, nome_parceiro, id_parceiro, nome_municipio,


id_estado, id_pais, dt_primeira_venda_comercial
from `b2w-bee-analytics.clean_seller.cadastro`
where area = 'TOPKA'
and situacao = 'Ativo'
order by analista, nome_parceiro

Com isso o consumo de dados diminui bastante!


Data Academy B2W DIGITAL

Particionamento

Cada tabela pode ter uma ou mais “colunas de particionamento”

Em geral são colunas de data. Com elas você pode instruir a bee a
pegar só uma fatia da tabela, sem ter que percorrê-la inteira

Você não precisa ir até a Pré-História pra pegar só o último Tri :)

2017 2018 2019 2020

Jan
Mar
Fev
Consulte o particionamento na documentação de cada tabela
Data Academy B2W DIGITAL

Documentação

No painel esquerdo, clique no Projeto, depois no Dataset e na Tabela,


e no painel inferior clique em Detalhes

E observe os campos Tamanho da tabela e Particionada no Campo

Encontrou campos de particionamento? WHERE neles!!

WHERE em outros campos: não diminui a qtd Dados processados


Data Academy B2W DIGITAL

“Mas Sallin, e o Limit?”

LIMIT retorna apenas as X primeiras linhas do resultado:

select analista, nome_parceiro, id_parceiro as cnpj,


nome_municipio as cidade, id_estado, id_pais,
dt_primeira_venda_comercial comecou_em
from `b2w-bee-analytics.clean_seller.cadastro`
order by nome_parceiro
limit 10;

LIMIT não tem nenhum efeito na quantidade de dados processados. Ele não serve pra isso!
Vamos ver na aula 4 alguns casos em que ele é bastante útil
Data Academy B2W DIGITAL

“O que é um NULL?”
-- Johnny Lawrence (Cobra Kai)
NULL

NULL é um valor especial do banco de dados para “dados indisponíveis”


Pode ser apenas um erro de quem fez o cadastro!
Ou um autêntico bug: o sistema de origem permite nome nulo?
Data Academy B2W DIGITAL

Recursos da bee
Data Academy B2W DIGITAL

Formatar Consultas

Organize melhor as suas queries


(ou não...)

Alguns preferem esse formato


mais “vertical” sugerido pela bee,

maasss

existe o debate :)
Data Academy B2W DIGITAL

Salvar Consultas

Guarde suas consultas para rodar mais tarde!

Elas ficam salvas no próprio Big Query


Data Academy B2W DIGITAL

Salvar Consultas

Aproveite pra dar um nome bem explicativo

Assim seus colegas podem usar também!


Data Academy B2W DIGITAL

Salvar Consultas

Aproveite pra dar um nome bem explicativo

Assim seus colegas podem usar também!


Data Academy B2W DIGITAL

Salvar Resultados

Encontrou o que queria?

Guarde no próprio Big Query como uma nova tabela!

Ou se preferir, baixe os dados para o seu computador

(cuidado com consultas muito grandes!)


Data Academy B2W DIGITAL

Salvar Resultados

Encontrou o que queria?

Guarde no próprio Big Query como uma nova tabela!

Ou se preferir, baixe os dados para o seu computador

(cuidado com consultas muito grandes!)


Data Academy B2W DIGITAL

Salvar Resultados

Encontrou o que queria?

Guarde no próprio Big Query como uma nova tabela!

Ou se preferir, baixe os dados para o seu computador

(cuidado com consultas muito grandes!)


Data Academy B2W DIGITAL

Importando dados
pra bee
Data Academy B2W DIGITAL

Importando dados pra bee

“”Mas Sallin, como eu faço pra subir a minha base pra bee?””

Exercício: importar um arquivo .csv com alguns dados


Vamos lá?
Data Academy B2W DIGITAL

Importando dados pra bee

Clique no seu projeto, clique em Criar Dataset, dê um nome e clique em Criar


Data Academy B2W DIGITAL

Importando dados pra bee

Clique no Dataset, clique em Criar Tabela


Selecione Criar tabela de: Upload, Formato: CSV
Data Academy B2W DIGITAL

Importando dados pra bee

Selecione o seu Projeto e o Dataset recém-criado


Digite um nome para a nova tabela
Clique em Auto Detectar Esquema e Criar Tabela
● Por padrão a bee identifica campos delimitados por vírgula
● É possível alterar o delimitador de campos em Opções
Avançadas
Data Academy B2W DIGITAL

Importando dados pra bee

Você também pode definir as colunas


individualmente, em vez de deixar a bee identificar

É só desmarcar a opção Auto Detectar, clicar em


Adicionar Campo e especificar nome e o tipo de
dados todos os campos
Data Academy B2W DIGITAL

“Mas Sallin, o que são esses Tipos de Dados?”

Numéricos Binário (aka Booleano)


Inteiros INT64 Sim/Não (ou True/False, 1/0, etc)
Números quebrados FLOAT64 STRING (ele armazena como S/N)
Existe também o BOOL
Texto
Varchar(x): texto livre até X caracteres STRING Outros tipos
Dados geográficos (latitude/longitude, rotas, etc)
Data Imagens, som, vídeo, software
Com ou sem a hora: DATETIME ou DATE Arquivos (aka BLOBs: Binary Large Objects)

Outros BD’s podem conter ainda outros tipos


Data Academy B2W DIGITAL

Importando dados pra bee

E pronto! A sua tabela agora está na bee. Você pode consultá-la usando SQL
● Este é um upload pontual de dados!
● Se o csv mudar, os dados não serão atualizados na bee
● Se você quiser passar seus dados diariamente para a bee, procure help.bee@b2wdigital.com
● O time de Engenharia da bee usa todas as técnicas de ingestão de dados
Data Academy B2W DIGITAL

Exercício: importar
um arquivo .csv para
o seu dataset
Data Academy B2W DIGITAL

Aula 3

https://universoamericanas.neolude.com.br/Pr
esentialMeeting/ConfirmPresence/Nzk1ODg6
NTMzMjg=
Data Academy B2W DIGITAL

AGENDA

Aula 1 Fundamentos do Relacional; Conhecendo a bee; A Linguagem SQL

Aula 2 Exercício com dados de vendas; Cuidados com queries; Recursos da bee

Aula 3 Chave Estrangeira; Diagrama de Dados; Joins: Inner e Outer

Aula 4 Subqueries e With: dividir para conquistar; Criando um monitoramento diário; Além da Bee
Data Academy B2W DIGITAL

Chaves Estrangeiras
e Modelo de Dados
(Entidade-Relacionamento)
Data Academy B2W DIGITAL

Chave Estrangeira

Ou também Foreign Key, FK, etc


Elimina redundância nos dados
Referência aos dados de outra tabela
Permite interligar tabelas
Data Academy B2W DIGITAL

Chave Estrangeira

Cliente Endereço Produto Qtd Valor Anomalias nos dados:


Redundância (consumo de espaço)
Fulano Fidêncio Ramos 302 Geladeira 1 1250
Dificuldade para atualizar
Potencial para Inconsistências
Beltrano Sacadura Cabral 130 Videogame 1 3000

Fulano Fidêncio Ramos 302 Videogame 1 3000

Beltrano Sacadura Cabral 103 Máq. Lavar 1 1500

150 mil pedidos por dia!!


Data Academy B2W DIGITAL

Chave Estrangeira Chaves Estrangeiras


apontam para chaves
ID Produto
ID Cliente Endereço primárias de outra tabela
10 Geladeira
1 Fulano Fidêncio Ramos 302
20 Videogame
2 Beltrano Sacadura Cabral 130
30 Máq. Lavar

ID Cliente ID Produto Qtd Valor

1 10 1 1250

2 20 1 3000

1 20 1 3000

2 30 1 1500
Data Academy B2W DIGITAL

Chave Estrangeira - Modelo de Dados

Cliente Um pedido é feito por um cliente


Mas um cliente faz vários pedidos
Relacionamento um para muitos

Pedido
1:N
Data Academy B2W DIGITAL

Chave Estrangeira - Modelo de Dados

Cliente e Produto compõem um


Relacionamento M:N (muitos para muitos)

Cliente Produto
Um Produto é comprado por vários Clientes
(em vários pedidos)

E um Cliente pode comprar vários Produtos


diferentes (em pedidos diferentes ou, no caso da B2W,
também no mesmo pedido)

Pedido
Existe também o Relacionamento 1:1
(pouco usado)
Data Academy B2W DIGITAL

Modelo de Dados

Relacionamentos ligam Entidades


Entidade Entidade
Modelo de Dados
Cliente Produto
ou
Modelo de Entidade-Relacionamento
(ou tb Diagrama)
Relacionamento

Relacionamento
É o mapa de um sistema
Entidade

Pedido Com ele, você consegue entender o que a


empresa/time/sistema faz, graficamente!
Data Academy B2W DIGITAL

Modelo de Dados

Cliente Produto
Relacionamentos (às vezes) têm nomes
É feito por →

Contém →
Pode ser nos dois sentidos
Pode ser em um sentido
Pode não ter nome nenhum :)

Pedido
Faz → ← Está contido em
Data Academy B2W DIGITAL

Exemplo de Modelo de Dados: uma loja física


(no e-commerce mudam algumas coisas, mas não muitas)

← Entrega Usa → Placa


Cliente Transportadora Caminhão Capacidade (Kg)
Motorista

Nome Razão Social


Data Cadastro CNPJ
Endereço Contato
CPF
RG
Será pago em → Usa →

Faz →
Pedido Pagamento Forma Pagto
Valor Total Data Pagto Nome
Data Foi Pago?
Vendedor Qtd Dias Atraso
Taxa Juros Diária
Desconto Financeiro
Código
Contém → ← Está no Nome Produto
Item Produto Categoria
Ficha Técnica
Foto
Quantidade
Desconto Comercial
Data Academy B2W DIGITAL

Joins
Data Academy B2W DIGITAL

Joins

Joins são recursos da linguagem SQL que acionam as chaves primárias e estrangeiras das tabelas

Com eles é possível juntar (join) duas tabelas num único resultado contendo os dados de ambas as tabelas

Vamos começar vendo o tipo mais comum de Join:

INNER JOIN traz só o que tiver correspondência em ambas as tabelas


Garante a correspondência, mas não os dados completos

Existe também o OUTER JOIN , mas vamos manter o suspense por alguns slides!
Data Academy B2W DIGITAL

Joins

select idA, campoA, idB, campoB Traz apenas os idA que também estiverem na tabela B.

from tabelaA INNER JOIN tabelaB on idA = idB Se tiver só na A, não vai aparecer!

tabelaA é chamada de tabela esquerda, e tabelaB é a tabela direita

Não precisa ficar tudo numa mesma linha (e em geral não fica)

As tabelas são juntadas por seus campos idA e idB, em busca de valores em comum
Data Academy B2W DIGITAL

Joins

b2w-bee-sandbox.sallin.cargos b2w-bee-sandbox.sallin.pessoas
ID Cargo ID Pessoa cargo
1 Analista de Produto 1 Roberta 7
2 Analista de Risco 2 Luciano 4
3 Analista Financeiro 3 Solange 3
4 Desenvolvedor Back End 4 Bruno 6
5 Desenvolvedor Front End 5 Paulo 2
6 Designer de UX 6 Enzo NULL
Estagiário recém-contratado! :)
7 Gerente
Data Academy B2W DIGITAL

Joins

select c.id idCargo, c.nome cargo, p.id


idPessoa, p.nome pessoa
from `b2w-bee-sandbox.sallin.cargos` as c
INNER JOIN idCargo Cargo idPessoa Pessoa
`b2w-bee-sandbox.sallin.pessoas` p 2 Analista de Risco 5 Paulo
on p.cargo = c.id
order by 1; 3 Analista Financeiro 3 Solange
4 Desenvolvedor Back End 2 Luciano
6 Designer de UX 4 Bruno
“Quem são os funcionários
registrados da minha empresa?” 7 Gerente 1 Roberta
Data Academy B2W DIGITAL

Exercício: juntar as
suas tabelas de
Pessoas e Cargos
Data Academy B2W DIGITAL

Joins

Agora vamos resolver o suspense do Outer Join!

Lembram do Inner Join?

INNER JOIN traz só o que tiver correspondência em ambas as tabelas


Garante a correspondência, mas não os dados completos

OUTER JOIN traz as tabelas inteiras e faz a correspondência onde possível


mais flexível que o Inner Join
Garante os dados completos, mas não a correspondência
Data Academy B2W DIGITAL

Joins

select idA, campoA, idB, campoB Traz todos os idA da tabelaA, mesmo que não estejam na
from tabelaA tabelaB.
LEFT OUTER JOIN tabelaB on idA = idB Quando tiver, faz a correspondência com o idB

select idA, campoA, idB, campoB Traz todos os idB da tabelaB, mesmo que não estejam na
from tabelaA tabelaA.
RIGHT OUTER JOIN tabelaB on idA = idB Quando tiver, faz a correspondência com o idA
Data Academy B2W DIGITAL

Joins

select c.id idCargo, c.nome cargo, p.id


idPessoa, p.nome pessoa
from `b2w-bee-sandbox.sallin.cargos` c
LEFT OUTER JOIN idCargo Cargo idPessoa Pessoa
`b2w-bee-sandbox.sallin.pessoas` p 1 Analista de Negócio NULL NULL
on p.cargo = c.id
order by 1; 2 Analista de Risco 5 Paulo
3 Analista Financeiro 3 Solange
4 Desenvolvedor Back End 2 Luciano
“Quais são os cargos que preciso preencher na minha empresa?”
5 Desenvolvedor Front End NULL NULL
6 Designer de UX 4 Bruno
7 Gerente 1 Roberta
Data Academy B2W DIGITAL

Exercício: testar o
Outer Join
Data Academy B2W DIGITAL

Joins

select c.id idCargo, c.nome cargo, p.id


idPessoa, p.nome pessoa
from `b2w-bee-sandbox.sallin.cargos` c
LEFT OUTER JOIN
idCargo Cargo idPessoa Pessoa
`b2w-bee-sandbox.sallin.pessoas` p
on p.cargo = c.id 1 Analista de Negócio NULL NULL
WHERE p.id IS NULL 5 Desenvolvedor Front End NULL NULL
order by 1;

“Quais são apenas os cargos que preciso preencher na minha


empresa?”
Data Academy B2W DIGITAL

Exercício: testar o
Outer Join filtrando
linhas NULL
Data Academy B2W DIGITAL

Joins

select c.id idCargo, c.nome cargo, p.id


idPessoa, p.nome pessoa
from `b2w-bee-sandbox.sallin.cargos` c
RIGHT OUTER JOIN
idCargo Cargo idPessoa Pessoa
`b2w-bee-sandbox.sallin.pessoas` p
on p.cargo = c.id 7 Gerente 1 Roberta
-- WHERE p.id IS NULL 4 Desenvolvedor Back End 2 Luciano
order by 1;
3 Analista Financeiro 3 Solange
6 Designer de UX 4 Bruno
“Quem são as pessoas sem cargo na minha empresa?” 2 Analista de Risco 5 Paulo
NULL NULL 6 Enzo
Data Academy B2W DIGITAL

Exercício: testar o
Right Outer Join
Data Academy B2W DIGITAL

Joins

select c.id idCargo, c.nome cargo, p.id


idPessoa, p.nome pessoa
from `b2w-bee-sandbox.sallin.pessoas` p
LEFT OUTER JOIN
idCargo Cargo idPessoa Pessoa
`b2w-bee-sandbox.sallin.cargos` c
on p.cargo = c.id 7 Gerente 1 Roberta
-- WHERE p.id IS NULL 4 Desenvolvedor Back End 2 Luciano
order by 1;
3 Analista Financeiro 3 Solange
6 Designer de UX 4 Bruno
“Quem são as pessoas sem cargo na minha empresa?” 2 Analista de Risco 5 Paulo
NULL NULL 6 Enzo
Data Academy B2W DIGITAL

Exercício: inverter
Right e Left Outer
Joins
Data Academy B2W DIGITAL

Joins

select idA, campoA, idB, campoB Traz todos os idA da tabelaA e todos os idB da tabelaB,
from tabelaA havendo ou não correspondência
FULL OUTER JOIN tabelaB on idA = idB
Quando tiver correspondência, ela aparece
Data Academy B2W DIGITAL

Joins

select c.id idCargo, c.nome cargo, p.id


idPessoa, p.nome pessoa
from `b2w-bee-sandbox.sallin.pessoas` p
FULL OUTER JOIN
idCargo Cargo idPessoa Pessoa
`b2w-bee-sandbox.sallin.cargos` c
on p.cargo = c.id 1 Analista de Negócio NULL NULL
-- WHERE p.id IS NULL 2 Analista de Risco 5 Paulo
order by 1;
3 Analista Financeiro 3 Solange
4 Desenvolvedor Back End 2 Luciano
“Visão total de RH: pessoas com cargo,
5 Desenvolvedor Front End NULL NULL
pessoas sem cargo, cargos sem pessoa”
6 Designer de UX 4 Bruno
7 Gerente 1 Roberta
NULL NULL 6 Enzo
Data Academy B2W DIGITAL

Exercício: testar o
Full Outer Join
Data Academy B2W DIGITAL

Joins Inner Join Full Outer Join

Resumindo os diversos tipos de Join: Left Outer Join Right Outer Join
Data Academy B2W DIGITAL

Aula 4

https://universoamericanas.neolude.com.br/Pr
esentialMeeting/ConfirmPresence/Nzk1ODk6
NTMzMjg=
Data Academy B2W DIGITAL

AGENDA

Aula 1 Fundamentos do Relacional; Conhecendo a bee; A Linguagem SQL

Aula 2 Exercício com dados de vendas; Cuidados com queries; Recursos da bee

Aula 3 Chave Estrangeira; Diagrama de Dados; Joins: Inner e Outer

Aula 4 Subqueries e With: dividir para conquistar; Criando um monitoramento diário; Além da Bee
Data Academy B2W DIGITAL

Subqueries: dividir
para conquistar
Data Academy B2W DIGITAL

Subqueries: dividir para conquistar

Imagine que você quer rodar uma query mais complexa, por exemplo:

“Quais são os Top 10 produtos vendidos pelos Top 10 Sellers em GMV no mês?”

● Não queremos saber quanto vendeu


● Nem quem são os Sellers que mais venderam
● Queremos saber só os produtos
● Mas precisamos agrupar por Seller pra saber quem está no filtro!
Data Academy B2W DIGITAL

A parte do filtro já sabemos fazer:

SELECT seller_id, -- traz o ID do seller


cast(sum(order_line_total_value) as int64) as gmv -- GMV (sem os centavos)
FROM `b2w-bee-analytics.evaluated_sales.sales` -- tabela de vendas
WHERE date(partition_date) >= "2021-01-01" -- filtro de data
and payment_status = 'APROVADO' -- só venda aprovada
and marketplace_flag = 'Y' -- pra trazer só 3P
group by 1 -- agrupa pelo seller
order by 2 desc -- rankeia pelo GMV
limit 10; -- pega só os Top 10

Mas e agora? Queremos os produtos, não os sellers!


Data Academy B2W DIGITAL

É aqui que entram as subqueries: uma query dentro da outra!

SELECT pit, -- traz o PIT,


cast(sum(order_line_total_value) as int64) as gmv -- e o resto
FROM `b2w-bee-analytics.evaluated_sales.sales` -- é tudo
WHERE date(partition_date) >= "2021-01-01" -- igualzinho
and payment_status = 'APROVADO' -- o de antes,
and seller_id in ( -- MAS AGORA...
SELECT seller_id
FROM `b2w-bee-analytics.evaluated_sales.sales` -- ...nossa
WHERE date(partition_date) >= "2021-01-01" -- query
and payment_status = 'APROVADO' -- anterior
and marketplace_flag = 'Y' -- será usada
group by 1 -- como filtro
order by sum(order_line_total_value) desc -- de outra
limit 10 -- query
)
group by 1 -- etc
order by 2 desc -- e
limit 10; -- tal
Data Academy B2W DIGITAL

Subqueries: dividir para conquistar

O que a bee fez?


● Primeiro ele rodou a query de “dentro” e descobriu os sellers
● Depois ele guardou esse resultado na memória
● E usou como base pra fazer o filtro da query principal

Sim, a bee consegue fazer queries com várias “etapas”!


Data Academy B2W DIGITAL

SELECT pit,
cast(sum(order_line_total_value) as int64) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
Subqueries: dividir para conquistar WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
and seller_id in (
SELECT seller_id
Mas tem alguns detalhes:
FROM `b2w-bee-analytics.evaluated_sales.sales`
Subqueries devem retornar apenas um campo WHERE date(partition_date) >= "2021-01-01"
quando usadas em filtros
and payment_status = 'APROVADO'
and marketplace_flag = 'Y'
Então alteramos o Order By e colocamos a métrica group by 1
(GMV) diretamente na ordenação order by sum(order_line_total_value) desc
limit 10
A ordenação é necessária na query de dentro, para )
garantir os 10 maiores sellers group by 1
order by 2 desc
limit 10;
Data Academy B2W DIGITAL

Subqueries: dividir para conquistar

E tem um detalhe mais importante ainda: estas são as vendas desses PITs com esses sellers!
Se é essa resposta que você procura, tudo bem!
Mas poderíamos pegar as vendas totais desses PITs! (com qualquer seller, não só Top 10)

Essa query poderia ser ainda mais complexa...


Data Academy B2W DIGITAL

Subqueries: dividir para conquistar

“Dados os Top 10 produtos vendidos pelos Top 10 Sellers em GMV no mês, qual a participação desse grupo de Sellers nas
vendas totais desses produtos?”

Agora complicou!!
Data Academy B2W DIGITAL

Subqueries: dividir para conquistar

Vamos quebrar o problema em partes?

● Pegar as vendas totais por Seller e os Top 10 Sellers


● Pegar as vendas por PIT desses Sellers e pegar os Top 10 PITs dentre eles (e se fosse Top 10 PITs por Seller?)
● Pegar as vendas totais desses mesmos PITs (com qualquer Seller, inclusive 1P)
● Fazer “um sobre o outro” e calcular a participação
Data Academy B2W DIGITAL

With: dividir para conquistar

Quando o fluxo de subqueries fica muito complexo, podemos usar a cláusula… WITH
Ela consegue transformar as lógicas mais complexas em um pipeline de processamento,
o que a torna um dos recursos mais poderosos da linguagem SQL

Vamos ver como fica?


Data Academy B2W DIGITAL

With: dividir para conquistar

Passo 1: Pegar as vendas totais por Seller e os Top 10 Sellers. Esse já temos:

SELECT seller_id, sum(order_line_total_value) as gmv


FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
and marketplace_flag = 'Y'
group by 1
order by 2 desc
limit 10;

Como se diz nos programas de receitas culinárias… Reserve!


Data Academy B2W DIGITAL

With: dividir para conquistar SELECT pit,


cast(sum(order_line_total_value) as int64) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
and seller_id in (
SELECT seller_id
Passo 2: Pegar as Top 10 PITs mais vendidos por esse FROM `b2w-bee-analytics.evaluated_sales.sales`
grupo de Sellers WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
É a nossa query com subquery. Isso também já temos: and marketplace_flag = 'Y'
group by 1
order by sum(order_line_total_value) desc
limit 10
)
group by 1
order by 2 desc
limit 10;
Data Academy B2W DIGITAL

With: dividir para conquistar

Vamos mudar esse exemplo pra usar o With.

Primeiro a gente define um “step” com a query reservada: um bloco entre parênteses com um nome...

with top10sellers as (
SELECT seller_id, cast(sum(order_line_total_value) as int64) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
and marketplace_flag = 'Y'
group by 1
order by 2 desc
limit 10
)
...
Data Academy B2W DIGITAL

with
top10sellers as (
SELECT seller_id, sum(order_line_total_value) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
and marketplace_flag = 'Y'
group by 1
...e esse step passa a ficar disponível para os order by 2 desc
seguintes, limit 10
como se fosse uma tabela temporária!!! ),
top10pitsDessesSellers as (
SELECT pit, cast(sum(order_line_total_value) as int64) as gmv
(apenas durante a execução dessa query)
FROM `b2w-bee-analytics.evaluated_sales.sales` s
inner join top10sellers t on s.seller_id = t.seller_id
Olha o que dá pra fazer: WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
and marketplace_flag = 'Y'
group by 1
order by 2 desc
limit 10
)
select * from top10pitsDessesSellers
Data Academy B2W DIGITAL

with
top10sellers as (
...
),
top10pitsDessesSellers as (
...
Agora vamos para o Passo 3: pegar as
),
vendas totais desses mesmos PITs
vendaTotalDosTop10pits as (
SELECT s.pit, cast(sum(order_line_total_value) as int64) as gmv
Agora é só questão de incluir mais steps, FROM `b2w-bee-analytics.evaluated_sales.sales` s
aproveitando as tabelas já existentes inner join top10pitsDessesSellers p on s.pit = p.pit
WHERE date(partition_date) >= "2021-01-01"
and payment_status = 'APROVADO'
E um último select pro resultado final:
and marketplace_flag = 'Y'
group by 1
)

select * from vendaTotalDosTop10pits


Data Academy B2W DIGITAL

with
top10sellers as (
...
),
Agora, o Passo 4 é brincadeira de criança!
top10pitsDessesSellers as (
...
Fazer “um sobre o outro” e calcular a ),
participação dos sellers vendaTotalDosTop10pits as (
...
Os dados já estão todos prontos! )

select p.pit,
(neste exemplo já estamos multiplicando por 100, p.gmv gmv_com_top_10_sellers,
pra dar a porcentagem) t.gmv gmv_total,
round( p.gmv / t.gmv * 100, 2) as participacao
from top10pitsDessesSellers p
inner join vendaTotalDosTop10pits t on p.pit = t.pit
Data Academy B2W DIGITAL

With: dividir para conquistar

Imagina o que dá pra fazer com isso!!


● Pegar o depto principal do seller
● Calcular participação de cada parte em relação ao todo automaticamente
● Separar quebras de uma mesma tabela e comparar uma com a outra
● Comparar períodos diferentes de uma mesma tabela

A desvantagem das Subqueries e With é a performance: o uso de memória aumenta muito, e o uso
de índices fica muito restrito

Se a sua query der problemas de estouro de memória, a solução é abrir mão do With: crie tabelas
temporárias, guarde os seus resultados, e apague tudo depois com drop table.

“Ahhh, eu tô maluco!!” -- reação dos SQLzeiros do RJ, já em 1997


Data Academy B2W DIGITAL

Scripts +
Agendamento +
Data Studio =
seu próprio
monitoramento!
Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

E se você pudesse atualizar os dados da sua análise com apenas 1 clique?


Deixar a query toda pronta e já guardar os dados finais?

Com os Scripts da bee isso é possível!


Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

Um script não é nada mais que um conjunto de queries no mesmo “texto”.


É só você colocar as suas queries todas na sequência, e pronto, já tem um script!
● Criar tabelas com o resultado de cada query
● As queries seguintes aproveitam os resultados das anteriores
● Isso permite quebrar a lógica e fazer buscas muito complexas nos dados

Vamos fazer um exemplo?


Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

Imagine que você quer pegar diariamente as vendas de um produto específico: PlayStation 5.
Você já tem a query prontinha, pegando as vendas de ontem:

SELECT date(order_date) as dia,


customer_state,
class_description,
case when seller_id is null then '1P' else '3P' end as p,
count(*) as qtd_pedidos,
cast(sum(order_line_total_value) as int64) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
WHERE date(partition_date) = date_sub(current_date(), interval 1 day)
and lower(sku_description) like '%ps5%'
and department_description = 'CONSOLES & GAMES'
group by 1, 2, 3, 4;
Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

Note que essa query pega sempre os dados de ontem!


(também conhecido como D-1)

Isso garante a informação completa, independente do


horário de execução

Se pegarmos na query o dia de hoje, os dados virão


incompletos! (vendas em tempo real)
Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

O próximo passo é fazer a bee criar uma tabela pra guardar o resultado de hoje.
É só incluir esta linha antes do seu select: (crie antes um dataset novo pra este exercício!)

create or replace table `projeto.dataset.tabela_temp`


as
select ...
A partir daí ele guarda o dado diário. Cada vez que essa query for rodada, a bee vai levantar os dados e jogar nessa tabela,
apagando o que estiver nela antes.
Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

Agora temos que começar a acumular o histórico!


Vamos criar uma segunda tabela pra isso, com os mesmos dados da primeira. É só rodar numa aba separada:

create or replace table `projeto.dataset.tabela_hist`


as
select * from `projeto.dataset.tabela_temp`;
Aí você terá as duas tabelas, com os mesmos campos:
● uma “temporária” com os dados de hoje;
● e a outra de “histórico” vai acumular os dados, dia após dia.

Você pode usar outros nomes pras tabelas se preferir!


Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

Volte pra aba anterior, e logo depois do Select já feito, inclua o seguinte:

delete from `projeto.dataset.tabela_hist`


where dia = date_sub(current_date(), interval 1 day);

insert into `projeto.dataset.tabela_hist`


select * from `projeto.dataset.tabela_temp`;
Data Academy B2W DIGITAL

create or replace table `projeto.dataset.tabela_temp` as


SELECT date(order_date) as dia,
customer_state,
class_description,
case when seller_id is null then '1P' else '3P' end as p,
count(*) as qtd_pedidos,
cast(sum(order_line_total_value) as int64) as gmv
FROM `b2w-bee-analytics.evaluated_sales.sales`
No final o seu script WHERE date(partition_date) = date_sub(current_date(), interval 1 day)
deve estar assim: and lower(sku_description) like '%ps5%'
and department_description = 'CONSOLES & GAMES'
group by 1, 2, 3, 4;

delete from `projeto.dataset.tabela_hist`


where dia = date_sub(current_date(), interval 1 day);

insert into `projeto.dataset.tabela_hist`


select * from `projeto.dataset.tabela_temp`;
Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

“Não entendi o que esse script faz, Sallin!” É simples:

● Primeiro a bee pega o dado do dia (de ontem), e guarda na tabela Temporária
● Depois, na tabela de Histórico, ele apaga os dados referentes ao dia de ontem
○ “Mas pra que Sallin?” Só pra garantir que não vai duplicar os dados
● Por fim ele acumula na Histórico o dado do dia (de ontem)

“Mas não dá pra fazer numa tabela só?” Até dá…

mas assim fica mais organizado!! :)


Data Academy B2W DIGITAL

Seu próprio monitoramento! Criando o script

Agora é só salvar o seu script!

Por enquanto ainda não agendamos nada, então temos que


abrir o script e rodar todo dia

No dia 1, não tem muita graça: ele vai pegar os dados do


dia anterior (30) e copiar na tabela de histórico
Data Academy B2W DIGITAL

O pulo do gato é nos dias seguintes!!

No dia 2, ele pega os dados do dia anterior (dia 1), e acumula na tabela de histórico.

No dia 3, ele pega o dia 2 e acumula de novo. dia 3

A tabela de histórico vai ficando mais rica, a cada dia que você rodar o script!! dia 2

dia 1

dados de
bee “ontem” dia 30
(a cada dia)

Tabela temp Tabela hist


Data Academy B2W DIGITAL

Seu próprio monitoramento! Agendando

Mas por enquanto, ainda temos que entrar lá e rodar o script, todo dia.

E se você esquecer? Ou ficar doente? Ou se a sua internet der problema?

Pra isso podemos agendar o nosso script. A bee cuida de tudo e não esquece nada!

Vamos lá?
Data Academy B2W DIGITAL

Seu próprio monitoramento! Agendando

O primeiro passo é Salvar o seu script

Sim, já falamos disso, mas se você ainda não


salvou, salve agora!

Em seguida clique em Agendar Consulta e em 164

Criar Nova Consulta Agendada


Data Academy B2W DIGITAL

Seu próprio monitoramento! Agendando

No painel direito, dê um nome ao agendamento. Use o nome da


própria tabela atualizada para facilitar

Escolha a periodicidade. No nosso caso, diária.

Coloque um horário bem cedo! Pode ser de madrugada: a bee não dorme :)

O horário não importa quando são dados D-1. Mas em casos reais
pode haver dependências: outras tabelas que precisam rodar
antes. Na dúvida, consulte o time bee!

Clique em Agendar e pronto! Há opções pra ele enviar email a


cada execução bem-sucedida, e outros recursos
Data Academy B2W DIGITAL

Seu próprio monitoramento! Agendando

“E se eu tiver que mudar o


agendamento ou o script?”

Clique em Consultas Agendadas e


procure o seu agendamento na tela
que se abre
Data Academy B2W DIGITAL

Será exibido o histórico das últimas


execuções e o status (se rodou tudo OK
ou não)

Clique em Editar e ele vai mostrar


novamente a query no editor de
consultas

Faça as alterações necessárias e


clique em Agendar Consulta e em 167

Atualizar Consulta Agendada


Data Academy B2W DIGITAL

Ele vai oferecer novamente as opções de agendamento

Faça as suas alterações e clique em Agendar

Pronto! O agendamento está alterado, seja pra mudar o


horário ou o próprio script

Procure sempre salvar o seu script antes de mexer com


agendamentos!
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Pra coisa ficar completa, só falta um Dashboard!

Temos o Power BI pra fazer Dashboards, mas a bee também


tem sua ferramenta, o Data Studio

Funcionalidades bem parecidas entre as duas ferramentas

Vamos fazer um Dash simples com os nossos dados?

Entre no Data Studio em https://datastudio.google.com/


e clique em Criar e em Relatório
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Na página que se abre, selecione o


BigQuery como fonte de dados

Em seguida, em Adicionar Dados ao


Relatório, selecione seu projeto,
dataset e tabela

Clique em Adicionar 170


Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Ele vai criar um novo relatório em


branco, já com uma primeira
visualização simples

No menu superior, podemos


adicionar gráficos (charts),
controles e vários outros recursos

No painel à direita, as várias opções


do objeto selecionado
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Nosso primeiro gráfico será de linha, com as


vendas diárias

Clique em Inserir e depois em Série Temporal,


e posicione o gráfico

O próprio DS vai identificar as colunas de


tempo (dia) e a métrica (gmv).
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Nas opções você pode:

● trocar a métrica (qtd pedidos)


● trocar a data usada (se tiver)
● forçar um range de datas
● mudar cor e estilo da linha
● incluir linha de tendência

E outras opções típicas de gráficos,


quem conhece Excel sabe :)
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

2 dias

2 semanas!
Nos primeiros dias ele não terá muitos dados,
mas depois vai ficando mais interessante :)
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Agora vamos colocar mais um gráfico,


agora de colunas

Coloque na dimensão o campo


customer_state

Troque a métrica por gmv

O gráfico será atualizado


Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Nosso próximo gráfico será um TreeMap.


Ele mostra as subdivisões de um conjunto

Coloque na dimensão o campo


class_description
...
Troque a métrica por gmv
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Por fim, vamos colocar um gráfico de Pizza


● Este é só um exemplo, evite usar gráficos de pizza,
seja no trabalho ou na vida :)

Coloque na dimensão o campo p


(para separar 1P e 3P)

Troque a métrica por gmv


Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

Agora inclua um filtro no relatório usando a


...
opção Lista Drop-Down

Na opção Campo de Controle selecione o


campo customer_state (se o próprio DS não
tiver identificado)
Data Academy B2W DIGITAL

...

Coloque um título acima dos gráficos, e um


texto explicando o período e filtros aplicados

O resultado final vai ficar assim:


Data Academy B2W DIGITAL

Seu Dash está quase pronto!

Clique em Visualizar pra ver o resultado final.


Você pode mexer no filtro e ver o efeito nos
gráficos

Clicando em Editar você volta ao modo de


edição para alterar os gráficos, reposicionar,
ou incluir novos
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

E clicando em Compartilhar você divulga o


seu Dashboard pra B2W!

Clique em Convidar pessoas, digite seus


emails @b2wdigital e clique em Enviar!

Você controla se eles poderão alterar o Dash


ou apenas visualizar os dados
181
Data Academy B2W DIGITAL

Seu próprio monitoramento! Data Studio

E assim o ciclo se fecha! Fomos à bee, coletamos os dados, configuramos a atualização diária, e fizemos um Dashboard pra
visualizar os dados!

Mas existem algumas limitações:


● quando dá algum problema na execução, a bee não gera nenhum aviso/alerta. Você corre o risco de descobrir do “pior jeito”.
Tem que olhar periodicamente na tela de consultas Agendadas
● em caso de pipelines mais complexos, com muitas dependências (agendamento A usa tabelas geradas pelo agendamento B),
pode ser trabalhoso rastrear eventuais problemas
● o agendamento fica vinculado à conta do usuário que a construiu. Se a pessoa sair da empresa, os agendamentos são
passados pra outra pessoa do mesmo projeto, o que pode gerar bagunça

Mas para situações pontuais, como processos temporários e/ou de menor importância, o agendamento da bee resolve bem!
Data Academy B2W DIGITAL

Além da bee
Data Academy B2W DIGITAL

Além da bee

Muitos outros
sistemas usam SQL

Linguagem 99% igual


(mas aquele 1%...)

Na B2W: foco na bee

Consulte sempre a
documentação!
Data Academy B2W DIGITAL

Além da bee

Existe ainda o NoSQL: Not Only SQL

Surgiu a partir dos anos 2000

Não usa tabelas, e sim Documentos hierárquicos, Grafos em rede ou


Pares chave-valor, conforme o tipo

O modelo Wide-column é o mais “parecido” com SQL

Principais nomes: MongoDB, Neo4j, Redis, Cassandra

Podem substituir o SQL, mas também têm seus limites


Data Academy B2W DIGITAL

Obrigado por participar!

E conheça também o Projeto Pizzarias do Mundo,


a maior coleção de folhetos de pizza do planeta!
Data Academy B2W DIGITAL

Aulas 5, 6 e além (breve!)

● TRACE: como saber se a tabela é boa


● Information_schema: a Bee se olha no espelho
● Entendendo Date, Datetime, Timestamps, Fusos horários, e o Between
○ Conversão implícita: ele pega a partir da 0h e pode acabar pegando uma dia a menos
● Entendendo o NULL
● Comentários e padronização de código: legibilidade e organização
○ usar With em vez de subqueries
○ usar comentários explicando
○ separar select / from / joins / where / group / having / order by em cada linha
● Ordem de operações e Query plan: por baixo do capô do SQL
● Comparação Bee x PowerBI/Google Analytics
○ SQL mais flexível e performático, mas exige conhecer a base
● Criando Cluster columns e Partition columns
● Window Functions
● Coding Dojo: buscando a faixa preta de SQL
● Criação de tabelas e CRUD: crie seus próprios dados na mão! (pouco usado na prática)

Você também pode gostar