# Informatyka — zadanie 6.3

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2015-05/zad/6.3
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2015 (rozszerzona)
- rok: 2015
- poziom: rozszerzona
- typ: open
- punkty: 3
- działy: Bazy danych

## Treść

Kontekst - patrz zadanie 6.1.

Klasyfikacja generalna w danym sezonie jest tworzona na podstawie sumy punktów uzyskanych przez kierowców w wyścigach rozegranych w tym sezonie.

Utwórz zestawienie zawierające nazwiska i imiona kierowców - zwycięzców klasyfikacji generalnej w sezonach 2000, 2006 i 2012 wraz z liczbami punktów przez nich uzyskanymi.

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

| Imię | Nazwisko | Sezon | Suma Punktów |
| **Michael** | **Schumacher** | **2000** | **108** |
| **Fernando** | **Alonso** | **2006** | **134** |
| **Sebastian** | **Vettel** | **2012** | **281** |

## Sposób 1 - SQL (GROUP BY z agregacją punktów per kierowca per sezon)

Kluczowa idea: sumujemy punkty per kierowca w każdym z trzech sezonów, a następnie wybieramy maksymalny wynik dla każdego sezonu.

```sql
SELECT k.Imie, k.Nazwisko, w.Rok AS Sezon, SUM(wn.Punkty) AS Suma
FROM Wyniki wn
INNER JOIN Wyscigi w ON wn.Id_wyscigu = w.Id_wyscigu
INNER JOIN Kierowcy k ON wn.Id_kierowcy = k.Id_kierowcy
WHERE w.Rok IN (2000, 2006, 2012)
GROUP BY k.Id_kierowcy, w.Rok
HAVING SUM(wn.Punkty) = (
SELECT MAX(s.S) FROM (
SELECT SUM(wn2.Punkty) AS S
FROM Wyniki wn2 INNER JOIN Wyscigi w2 ON wn2.Id_wyscigu = w2.Id_wyscigu
WHERE w2.Rok = w.Rok
GROUP BY wn2.Id_kierowcy
) s
)
ORDER BY w.Rok;

**Wynik:**
Michael Schumacher 2000 108
Fernando Alonso 2006 134
Sebastian Vettel 2012 281

## Sposób 2 - Python (pandas, prostszy zapis)

```python
import pandas as pd

kierowcy = pd.read_csv('Kierowcy.txt', sep=';', header=None,
names=['Id_k', 'Nazwisko', 'Imie', 'Kraj'])
wyscigi = pd.read_csv('Wyscigi.txt', sep=';', header=None,
names=['Id_w', 'Rok', 'GrandPrix'])
wyniki = pd.read_csv('Wyniki.txt', sep=';', header=None,
names=['Id_k', 'Punkty', 'Id_w'])

# JOIN wszystkie 3 tabele
df = wyniki.merge(wyscigi, on='Id_w').merge(kierowcy, on='Id_k')

for sezon in [2000, 2006, 2012]:
s = df[df['Rok'] == sezon].groupby(['Imie', 'Nazwisko'])['Punkty'].sum()
najlepszy = s.idxmax()
print(f"{najlepszy[0]} {najlepszy[1]} | {sezon} | {s.max()}")

# Michael Schumacher | 2000 | 108
# Fernando Alonso | 2006 | 134
# Sebastian Vettel | 2012 | 281

## Sposób 3 - arkusz kalkulacyjny (tabela przestawna)

**Krok 1:** Wczytaj 3 pliki jako tabele. Połącz JOIN-em (PowerQuery / WYSZUKAJ.PIONOWO) Wyniki + Wyscigi po Id_w, dodaj kolumnę Rok.

**Krok 2:** Dodaj nazwisko i imię kierowcy przez WYSZUKAJ.PIONOWO po Id_k.

**Krok 3:** Tabela przestawna:
- Filtr: Rok IN {2000, 2006, 2012}
- Wiersze: Imie + Nazwisko
- Kolumny: Rok
- Wartości: SUMA(Punkty)

**Krok 4:** Dla każdej kolumny (sezonu) odczytaj kierowcę z najwyższą sumą.

## Reference informatyczny - agregacja warunkowa

> Reference - SQL GROUP BY + HAVING + podzapytanie skorelowane:
> - **GROUP BY a, b** - agregacja po dwóch kolumnach (kierowca i sezon).
> - **SUM(Punkty)** - suma punktów w grupie.
> - **HAVING SUM = (SELECT MAX )** - filtruje tylko zwycięzców.
> - **Podzapytanie skorelowane** - `w.Rok = w2.Rok` wiąże podzapytanie z zewnętrznym wierszem.
> Alternatywa: WINDOW FUNCTION `RANK() OVER (PARTITION BY Rok ORDER BY SUM(Punkty) DESC)`.

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.3, max 3 pkt):
> - **3 pkt** - poprawne odpowiedzi we wszystkich trzech wersach (3 zwycięzcy z 3 sezonów + sumy punktów).
> - **2 pkt** - poprawne odpowiedzi tylko w dwóch wersach.
> - **1 pkt** - poprawna odpowiedź tylko w jednym wersie.
> - **0 pkt** - odpowiedź niepełna lub błędna albo brak.

## Typowe pułapki

- **Klasyfikacja generalna ≠ jeden wyścig** - to SUMA punktów w danym sezonie, nie max z jednego wyścigu.
- **Każdy sezon ma swojego zwycięzcę** - trzeba wykonać agregację per (kierowca, sezon), a nie globalnie.
- **JOIN 3 tabel** - typowa pułapka: zapomnienie o jednym JOIN powoduje iloczyn kartezjański i błędne sumy.
- **Polskie imiona** - uważaj na pisownię (Michael, Fernando, Sebastian - zachowaj oryginał z pliku).
- **Liczba punktów dokładna** - klucz CKE wymaga konkretnych wartości 108 / 134 / 281.

## Złożoność obliczeniowa

- 3 JOIN-y po kluczach: O(N log N) z indeksami lub O(N · M · K) bez.
- GROUP BY z hash: O(N).
- Podzapytanie skorelowane bez optymalizacji: O(N · G) gdzie G = liczba grup.
- **Całkowita: O(N log N)** dla rozsądnej implementacji.

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2015-05/zad/6.3)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2015-05%2Fzad%2F6.3)

## Podobne zadania

- [Zadanie 6.3](https://matura.lol/question/informatyka-2023-czerwiec-matura-stara-rozszerzona-2/zad/6.3) — Zadanie 6.3. (0-3) Podaj nazwy pięciu krajów w których przeprowadzono najwięcej instalacji w przeliczeniu na 1 000 000 mieszkańców, oraz podaj liczby tych insta
- [Zadanie 6.4](https://matura.lol/question/informatyka-2019-czerwiec-matura-rozszerzona-2/zad/6.4) — Zadanie 6.4. (0-3) Podaj imiona i nazwiska agentów, którzy spośród swoich ofert z 2017 roku nie sprzedali żadnego domu ani mieszkania.
- [Zadanie 6.3](https://matura.lol/question/informatyka-2015-maj-matura-rozszerzona-2/zad/6.3) — Kontekst - patrz zadanie 6.1. Klasyfikacja generalna w danym sezonie jest tworzona na podstawie sumy punktów uzyskanych przez kierowców w wyścigach rozegranych 
- [Zadanie 8.2](https://matura.lol/question/informatyka-2024-grudzien-probna-rozszerzona/zad/8.2) — Zadanie 8.2. (0-2) Podaj nazwę najliczniej wykonywanej usługi (usluga) w badanym okresie oraz podaj, ile razy ją wykonano. Wymień marki samochodów, dla których 

_Ostatnia aktualizacja danych: 2026-10-03_
