Usando SQL para analisar 5 anos de um Bolão da NBA

Felipe Gollnick
5 min readJun 2, 2022
Photo by JC Gellidon on Unsplash

Na primeira série de posts deste blog, tentei analisar os palpites enviados pelos participantes de Bolão Gollnick dos Playoffs da NBA, uma brincadeira que organizo há cinco anos com meus amigos durante as épocas de mata-mata da NBA. Se você não leu, clique aqui para conferir pelo menos a parte 1 e entender melhor como funciona esse Bolão.

Pois bem, aquela primeira análise foi feita toda no Excel (no Google Spreadsheets, na verdade) e de forma completamente instintiva. Porém, a partir do fim de abril, comecei a estudar SQL e modelagem de banco de dados, e, desde o primeiro momento, fiquei muito empolgado para transformar os palpites em um banco de dados relacional e revirá-los com queries no MySQL Workbench.

Para você que está aqui lendo e não conhece o assunto: SQL é uma linguagem focada em consulta e manipulação de bancos de dados. Foi desenvolvida a partir dos anos 70 e fico abismado como, ainda hoje, ela é capaz de realizar consultas complexas e retornar resultados com base em uma infinidade de comandos lógicos e operações matemáticas. É uma parada simplesmente sensacional e que, até poucos meses atrás, eu mal sabia que existia. Uma query é uma consulta a esse banco de dados, realizada por meio da linguagem SQL.

Um banco de dados relacional é composto por dados organizados em diversas tabelas, de modo que tanto o espaço de armazenamento como a performance nas pesquisas seja otimizada. Na minha primeira análise, eu não conhecia esse conceito, portanto meu banco de dados era uma única tabela com mais de 700 linhas — cada uma delas contendo o nome do participante, o palpite, os times, a temporada, qual era a rodada do campeonato, se o palpite estava certo ou errado, etc.

Ao estudar modelagem de banco de dados, percebi que era possível desmembrar esses mesmos dados em várias tabelas, de modo que as informações ficassem armazenadas de forma menos redundante. Ei-las elas, as tabelas (sic):

1) Participante: contendo a ID do participante, seu nome completo e ano de estreia no Bolão;
2) Séries: contendo os confrontos entre os times, o ID dos confrontos, os times participantes (time de melhor campanha vs. time de pior campanha), qual a rodada do campeonato e qual a temporada;
3) Palpites: a maior tabela desse banco, contendo a ID dos participantes, quais foram seus palpites em quais rodadas de quais temporadas, e se os palpites estavam certos ou errados. Ela irá passar das 1.200 linhas ao final do Bolão de 2022;
4) Equipe: contendo a ID dos times e seus nomes completos;
5) Etapa: contendo a ID da etapa do mata-mata (1ª rodada, semi-finais de conferência, finais, etc) e seu nome completo
6) Temporada: contendo os anos do Bolão: 2018, 2019, etc.

Após dividir os dados em planilhas no Excel, importei as tabelas para o MySQL Workbench, criei as chaves primárias e estrangeiras, fiz as ligações entre as tabelas e acionei a engenharia reversa para chegar no modelo físico, que ficou assim:

Não vou especificar aqui o quê significa cada um desses termos, pois o post ficaria (ainda mais) longo. Mas segue um exemplo prático. Para um palpite em que eu botei, digamos 4x0 para o Celtics nas semi-finais do Leste em 2018: o meu nome está na tabela Participante; o palpite (e se ele estava certo ou errado) está em Palpites; os times que disputaram a série estão em Séries; o nome do time está em Equipe; a informação da semi-final está em Etapa; o ano está em Temporada.

****(Importante notar que, neste estudo, considero apenas os resultados finais de cada série de melhor de 7 partidas, e não os resultados individuais de cada jogo. É como se cada série fosse um único jogo em que o time que fizer 4 pontos primeiro, ganha)****

Com isso, por exemplo, posso bolar uma query em SQL com INNER JOINs para puxar todos os palpites que eu botei ao longo de todos os anos do Bolão.

Abaixo, a query para gerar o resultado acima:

A ID de cada participante é uma sigla de 3 ou 4 letras. “GOLL” é a minha ID.

Trata-se de uma query até complexa para retornar um resultado que um simples filtro naquela tabela enorme no Excel resolveria, certo? Certo. Mas como o objetivo é estudar SQL, seguimos.

Será que consigo fazer um ranking dos participantes que mais tiveram êxito no Bolão Gollnick ao longo dos cinco anos? Pois sim: abaixo, a quantidade de vezes que cada pessoa acertou o time que venceria o confronto.

Este ranking mostra a quantidade de acertos por participante, por ano. Quando há NULL é porque o participante não disputou o Bolão no ano em questão.

Na tabela Palpites, tenho uma coluna chamada “Acertou”, onde 1 é verdadeiro e 0 é falso. Dessa forma, consigo usar o SUM() para somas simples e o CASE WHEN para separar os acertos por temporada.

É preciso filtrar a query para que ela não retorne os registros do participante ‘GABA’, que é o Gabarito com o resultado real do confronto entre os times. O Gabarito consta na tabela Palpites como se fosse um participante e preciso levar isso em consideração em todas as queries em que analiso/comparo palpites.

Na tabela acima, porém, há muitos acertos: afinal, não é tão difícil acertar o vencedor de uma série — você tem 50% de chances de acertar quem ganhou.

Para descobrir quem é bom mesmo, eu posso fazer um ranking de CHINELINHOS, que é como eu carinhosamente chamo quando o participante acerta não só o vencedor, mas também acerta em cheio o placar final da série.

Da mesma forma que no caso anterior, na tabela Palpites, tenho uma coluna chamada “Chinelinho”, onde 1 é verdadeiro e 0 é falso. Dessa forma, consigo usar o SUM() para somas simples e o CASE WHEN para separar os acertos por temporada.

Clique aqui para seguir para a parte 2, onde veremos algumas queries mais complexas.

--

--

Felipe Gollnick

SQL | BI | Data | Power BI & Qlik | Passionate about sea trade logistics, music and Bahia