# Informatyka — zadanie 6.2

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

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

## Treść

Kontekst - patrz zadanie 6.1.

Znajdź wszystkie komputery w sekcji A, w których trzeba było przynajmniej dziesięciokrotnie wymieniać podzespoły. Podaj ich numery, a także liczbę wymian podzespołów dla każdego z nich.

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

## Poprawna odpowiedź

| Komputer | Liczba wymian podzespołów |
| Komputer 202 | 12 |
| Komputer 123 | 11 |
| Komputer 171 | 12 |
| Komputer 42 | 11 |

## Sposób 1 - SQL z trzema tabelami

**Schemat złączeń:**
- `komputery` (sekcja = 'A') ← `awarie` (Numer_komputera) ← `naprawy` (Numer_zgloszenia, Rodzaj = 'wymiana').

```sql
SELECT k.Numer_komputera, COUNT(*) AS liczba_wymian
FROM komputery k
JOIN awarie a ON k.Numer_komputera = a.Numer_komputera
JOIN naprawy n ON a.Numer_zgloszenia = n.Numer_zgloszenia
WHERE k.Sekcja = 'A' AND n.Rodzaj = 'wymiana'
GROUP BY k.Numer_komputera
HAVING COUNT(*) >= 10
ORDER BY k.Numer_komputera;

## Sposób 2 - Python

```python
from collections import Counter

# Wczytaj komputery sekcji A
sekcja_A = set()
with open('komputery.txt', encoding='utf-8') as f:
next(f)
for linia in f:
cz = linia.strip().split('\t')
if len(cz) >= 3 and cz[1] == 'A':
sekcja_A.add(cz[0])

# Mapuj zgłoszenie -> komputer (tylko sekcja A)
zgl_to_kom = {}
with open('awarie.txt', encoding='utf-8') as f:
next(f)
for linia in f:
cz = linia.strip().split('\t')
if len(cz) >= 4:
zgl, kom = cz[0], cz[1]
if kom in sekcja_A:
zgl_to_kom[zgl] = kom

# Licz wymiany
wymiany = Counter()
with open('naprawy.txt', encoding='utf-8') as f:
next(f)
for linia in f:
cz = linia.strip().split('\t')
if len(cz) >= 3 and cz[2] == 'wymiana':
zgl = cz[0]
if zgl in zgl_to_kom:
wymiany[zgl_to_kom[zgl]] += 1

# Filtruj >= 10
wynik = [(k, c) for k, c in wymiany.items() if c >= 10]
for k, c in sorted(wynik):
print(f"Komputer {k}: {c}")

**Wynik:**
Komputer 42: 11
Komputer 123: 11
Komputer 171: 12
Komputer 202: 12

## Reference informatyczny - JOIN i agregacja z filtrem

> Reference - Łańcuch JOIN:
> - 3-tablicowy JOIN: `A JOIN B ON JOIN C ON `.
> - Klucze: A.id = B.foreign_id, B.id = C.foreign_id.
> - Sekwencyjne JOINy są bardzo wydajne z indeksami.
>
> Reference - HAVING vs WHERE:
> - `WHERE` filtruje WIERSZE PRZED agregacją (przed GROUP BY).
> - `HAVING` filtruje GRUPY PO agregacji (po GROUP BY).
> - `HAVING COUNT(*) >= 10` to NIE może być w `WHERE`, bo COUNT to wynik agregacji.
>
> Reference - "Wymiana" jako Rodzaj:
> - Dane mają 2 wartości: 'restart' i 'wymiana'.
> - Filtr `WHERE Rodzaj = 'wymiana'` ogranicza do wymian podzespołów.

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.2, max 2 pkt):
> - **2 pkt** - wszystkie 4 wyniki (komputer + liczba) prawidłowe
> - **1 pkt** - tylko numery komputerów bez liczb wymian ALBO bez warunku `>= 10` (czyli wszystkie komputery sekcji A z liczbą wymian)
> - **0 pkt** - błędne lub brak

## Typowe pułapki

- **Pominięcie filtra Rodzaj = 'wymiana'** - wtedy liczymy restartów + wymian.
- **Pominięcie warunku Sekcja = 'A'** - wyniki dla wszystkich sekcji.
- **Mylenie awarii z naprawami** - awaria = zgłoszenie (zdarzenie), naprawa = działanie (rodzaj: restart/wymiana). JEDEN komputer może mieć WIELE awarii, każda awaria może mieć WIELE napraw.
- **WHERE COUNT(*) >= 10** - błąd składni. Musi być HAVING.
- **Liczenie awarii zamiast wymian** - wymiana to jeden Rodzaj naprawy; nie wszystkie naprawy są wymianami.
- **DISTINCT na Numer_komputera** - nieprawidłowe; wtedy każdy komputer liczy się tylko raz.

## Złożoność obliczeniowa

- Wczytanie 3 plików: O(K + A + N) gdzie K = ~500 komputerów, A = liczba awarii, N = liczba napraw.
- Filtrowanie i agregacja: O(K + A + N).
- **Łącznie: O(K + A + N).**

## Linki

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

## Podobne zadania

- [Zadanie 6.2](https://matura.lol/question/informatyka-2015-maj-matura-stara-podstawowa-2/zad/6.2) — Zadanie 6.2. (3 pkt) Podaj imię i nazwisko osoby, która ma łącznie najwięcej środków pieniężnych na wszystkich swoich kontach, oraz podaj wartość tych środków.
- [Zadanie 6.3](https://matura.lol/question/informatyka-2015-maj-matura-stara-podstawowa-2/zad/6.3) — Zadanie 6.3. (3 pkt) Podaj imiona i nazwiska osób, które są właścicielami największej liczby kont.
- [Zadanie 6.1](https://matura.lol/question/informatyka-2026-maj-matura-stara-rozszerzona-2/zad/6.1) — Zadanie 6.1. (0-2) Podaj imię i nazwisko klienta, który dokonał łącznie najwięcej transakcji w całym analizowanym okresie, oraz podaj liczbę tych transakcji.
- [Zadanie 6.2](https://matura.lol/question/informatyka-2026-maj-matura-stara-rozszerzona-2/zad/6.2) — Zadanie 6.2. (0-2) Podaj, ile kobiet (K) oraz ilu mężczyzn (M) spośród klientów sieci sklepów nie kupiło niczego w całym analizowanym okresie.

_Ostatnia aktualizacja danych: 2026-10-03_
