Projekt ma na celu przeprowadzenie analizy różnych aspektów dotyczących historii Formuły 1. W tym celu wykorzystałem bazę danych dotyczącą wydarzeń w Formule 1 na przestrzeni lat 1950 – 2022, która posłużyła jako baza do pisania zapytań w MySQL. Otrzymane wyniki zostały zilustrowane w postaci raportu utworzonego za pomocą programu Power BI.
Przedstawione poniżej zapytania umożliwiają zgłębienie historii Formuły 1, dając wgląd w dynamikę tego sportu. Główne obszary jakie zostały wzięte pod uwagę to:
• Statystki dotyczące sezonów, a więc na przykład to ile wyścigów wchodziło w kalendarz danego sezonu czy to na jakich torach i w jakich krajach odbywały się wyścigi.
• Analiza kierowców pod względem osiągnięć jakie zdobyli w trakcie swoich karier, dzięki czemu możliwe jest zidentyfikowanie dominujących postaci w całej historii Formuły 1 jak i na przestrzeni wybranych sezonów
• Analiza konstruktorów – podobnie jak w przypadku kierowców zapytania mają na celu stworzyć rankingi zespołów biorąc pod uwagę takie aspekty jak na przykład liczba wygranych wyścigów czy średnia liczba punktów zdobywanych na wyścig.
select Year as Season, count(Round) as Num_races_season
from races
group by Year
order by Year;
Powyższe zapytanie grupuje wyścigi po latach i oblicza liczbę wyścigów w każdym sezonie. Wynik jest sortowany rosnąco według roku. Na wykresie widać oczywisty trend wzrostowy liczby wyścigów w kolejnych latach. Początkowo w latach 50 wartość ta nie przekraczała 10 wyścigów, a w ostatnim sezonie odbyło się aż 22 wyścigi.
select Country, count(r.race_id) as Num_races_country
from circuits c left join races r on c.Circuit_ID = r.Circuit_Id
group by Country
order by 2 desc;
To zapytanie zestawia wyścigi według krajów, oblicza liczbę wyścigów w każdym kraju i sortuje wynik malejąco według liczby wyścigów. Prym w tym zestawieniu prowadzą kraje europejskie i USA, które od samego początku istnienia F1 praktycznie nie przerwanie organizują wyścigi Grand Prix.
select c.Country, c.Name_of_circuit, count(r.Race_Id) as num_races_ciruit
from circuits c left join races r on c.Circuit_ID = r.Circuit_ID
group by c.Country, c.Name_of_circuit
order by 3 desc;
Powyższe zapytanie prezentuje liczbę wyścigów na poszczególnych torach. Wyświetla kraj oraz nazwę toru, a wynik jest sortowany malejąco według liczby wyścigów. Wyniki tego zapytania zostały zwizualizowane za pomocą tak zwanej mapy drzewa. Do głównej kategorii należą tutaj kraje, które organizowały wyścig F1, a wyszczególnieniem są poszczególne tory na, których w tych krajach były organizowane zawody. Dzięki czemu można zobaczyć na ile torów i jak rozkładała się ogólna liczba wyścigów w danym kraju.
select count(distinct Race_ID) as total_num_races
from results;
select count(distinct country) as total_num_country
from circuits;
select count(Year) as total_num_seasons
from seasons;
select count(distinct Name_of_circuit) as total_num_circuits
from circuits;
select Nationality, count(Nationality)
from drivers
group by Nationality
order by 2 desc
Limit 7;
Zapytanie to identyfikuje siedem najczęstszych narodowości wśród kierowców którzy wystartowali chociaż w jednym wyścigu Formuły 1.
SELECT d.Name, SUM(r.Wins) AS num_wins, Sum(r.Pole_Position)
FROM results r LEFT JOIN drivers d ON r.Driver_Id = d.Driver_Id
GROUP BY d.Name
HAVING SUM(r.Wins) > (
SELECT AVG(total_wins) FROM (
SELECT d.Name, SUM(r.Wins) AS total_wins
FROM results r LEFT JOIN drivers d ON r.Driver_ID = d.Driver_Id
GROUP BY d.Name
) AS subquery
)
ORDER BY num_wins DESC
Limit 6;
Zapytanie to zestawia kierowców któych suma wygranych wyścigów jest większa niż średnia liczba wygranych wyścigów przypadających na jednego kierowce. Ponadto dla każdego keirowcy generuje liczbę wygranych i zdobytych pole position, a więc wygranych kwalifikacji do wyścigu. Wynik jest sortowany malejąco według liczby wygranych wyścigów i ograniczony do 6 kierowców, którzy tych zwycięstw mają w historii najwięcej. Na wykresie żółty pasek ilustruję liczbę wygranych wyścigów, a pasek fioletowych liczbę zdobytych Pole Position.
select d.Name, round(Avg(r.Position),2) as avg_finish, round(avg(r.grid),2) as avg_start
from results r left join drivers d on r.driver_id = d.driver_id
group by d.Name
having count(distinct r.Race_Id) > 20
order by 2 asc
Limit 10;
Zapytanie to identyfikuje dziesięciu kierowców, którzy uczestniczyli w co najmniej 20 wyścigach, prezentując ich średnią pozycję na mecie wyścigu oraz na starcie wyścigu, a więc średnia pozycję jaką zajmowali w kwalifikacjach poprzedzających wyścig. Wynik jest sortowany rosnąco według średniej pozycji na mecie. Wynik zapytania został przedstawiony na wykresie warstwowym, gdzie warstwa fioletowa oznacza średnią pozycje na starcie, a warstwa szara średnią pozycje kierowcy na mecie wyścigu.
select d.Name, Round((sum(r.wins)/count(distinct ra.race_id)),4) as '%_win', round((sum(r.pole_position)/count(distinct ra.race_id)),4) as '%_pole_position'
from results r left join drivers d on r.driver_id = d.driver_id left join races ra on r.Race_Id = ra.Race_Id
group by d.Name
having count(distinct ra.race_id) > 10 and sum(r.Wins) >= 1
order by 2 desc;
Zapytanie to odpowiada na pytanie jaki procent wyścigów, w których brał udział dany kierowca ostatecznie zostało przez niego wygranych. Analogicznie sytuacja ma się w przypadku zdobytych Pole Position i udziału w kwalifikacjach. Pod uwagę brani są kierowcy, którzy startowali w co najmniej 10 wyścigach, a także odnieśli przynajmniej jedno zwycięstwo w wyścigu. Otrzymany wynik jest sortowany według procenta wygranych wyścigów, który na wykresie przedstawiony jest kolorem fioletowym, a procent wygranych kwalifikacji kolorem zielonym.
select d.Name, (round(sum(r.points)/count(distinct r.race_ID),2)) as avg_points_per_race
from results r left join drivers d on r.driver_id = d.Driver_Id
group by d.Name
having count(distinct r.race_id) > 20
order by 2 desc;
Zapytanie to oblicza średnią liczbę punktów zdobywanych przez kierowców podczas jednego wyścigu. Pod uwagę brani są tylko ci kierowcy, którzy brali udział w co najmniej 20 wyścigach. Otrzymany wynik jest sortowany malejąco według średniej liczby punktów.
select count(distinct Race_ID) as total_num_races
from results;
select count(distinct country) as total_num_country
from circuits;
select count(distinct Constructor_Id) as total_num_drivers
from constructors;
select count(distinct driver_id) as total_num_circuits
from drivers;
select Nationality, count(Nationality) as num_nationality_con
from constructors
group by Nationality
order by 2 desc
limit 5;
Zapytanie to identyfikuje pięć krajów w których swoje siedziby miało bądź ma najwięcej zespołów F1 i przedstawia ich liczbę przypadającą każdej narodowości, sortując otrzymany wynik malejąco właśnie według tej liczby.
select c.Name_of_Constructor, sum(r.wins) as num_win_con, sum(r.Pole_Position) as num_pole_position_con
from constructors c left join results r on c.Constructor_Id = r.Constructor_Id
group by c.Name_of_Constructor
order by 2 desc
Limit 6;
Powyższe zapytanie zestawia konstruktorów według liczby wygranych wyścigów oraz zdobytych pole position. Wynik sortowany jest malejąco według tej pierwszej liczby. Na wykresie pasek żółtego koloru obrazuje liczbę wygranych wyścigów, a pasek fioletowy zdobytych pole position.
select Name_of_Constructor, sum(r.Points) as sum_point_con
from constructors c left join results r on c.Constructor_Id = r.Constructor_Id
group by Name_of_Constructor
order by 2 desc;
Powyższe zapytanie przedstawia konstruktorów według sumy zdobytych punktów. Otrzymany wynik sortowany jest malejąco po sumie zdobytych punktów.
select Name_of_Constructor, round(sum(r.Points)/(count(r.Race_Id)),2) as avg_points_per_race
from constructors c left join results r on c.Constructor_Id = r.Constructor_Id
group by Name_of_Constructor
having count(distinct r.Race_Id) > 10
order by 2 desc;
Zapytanie to oblicza średnią liczbę punktów zdobytych przez jeden samochód danego konstruktora podczas wyścigu. Uwzględnianie są tylko zespoły, które brały udział w co najmniej 10 wyścigach. Wynik sortowany jest malejąco według otrzymanej średniej liczby punktów na wyścig.