# Informatyka — zadanie 6.4

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2018-05/zad/6.4
> 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: 3
- działy: Bazy danych

## Treść

Kontekst - patrz zadanie 6.1.

Znajdź awarię, której usunięcie trwało najdłużej (czas liczymy od wystąpienia awarii do momentu zakończenia ostatniej z napraw, jakiej ta awaria wymagała). Podaj numer zgłoszenia, czas wystąpienia awarii i czas zakończenia ostatniej naprawy.

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

## Poprawna odpowiedź

**Numer zgłoszenia: 2087**

**Czas wystąpienia awarii: 06-11-2015 12:38:46**

**Czas zakończenia ostatniej naprawy: 13-11-2015 12:38:32**

## Sposób 1 - SQL

**Idea:** dla każdej awarii znajdź MAX(Czas_naprawy) (czas ostatniej naprawy), oblicz różnicę z Czas_awarii, znajdź maksimum.

```sql
SELECT a.Numer_zgloszenia, a.Czas_awarii, MAX(n.Czas_naprawy) AS ostatnia_naprawa
FROM awarie a
JOIN naprawy n ON a.Numer_zgloszenia = n.Numer_zgloszenia
GROUP BY a.Numer_zgloszenia, a.Czas_awarii
ORDER BY (julianday(MAX(n.Czas_naprawy)) - julianday(a.Czas_awarii)) DESC
LIMIT 1;

(W SQLite `julianday()` zwraca dzień juliański - pozwala odjąć daty. W innych SQL: `TIMESTAMPDIFF`, `EXTRACT(EPOCH )`.)

## Sposób 2 - Python

```python
from datetime import datetime
from collections import defaultdict

# Wczytaj awarie
awarie = {}
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, czas, prio = cz[0], cz[1], cz[2], cz[3]
awarie[zgl] = czas

# Mapuj zgl -> max czas_naprawy
max_naprawa = defaultdict(str)
with open('naprawy.txt', encoding='utf-8') as f:
next(f)
for linia in f:
cz = linia.strip().split('\t')
if len(cz) >= 3:
zgl, czas = cz[0], cz[1]
if czas > max_naprawa[zgl]:
max_naprawa[zgl] = czas

# Oblicz różnice i znajdź max
najwieksza_roznica = 0
najwiekszy_zgl = None
for zgl in awarie:
if zgl in max_naprawa:
t1 = datetime.strptime(awarie[zgl], '%Y-%m-%d %H:%M:%S')
t2 = datetime.strptime(max_naprawa[zgl], '%Y-%m-%d %H:%M:%S')
roznica = (t2 - t1).total_seconds()
if roznica > najwieksza_roznica:
najwieksza_roznica = roznica
najwiekszy_zgl = zgl

print(f"Zgłoszenie: {najwiekszy_zgl}")
print(f"Awaria: {awarie[najwiekszy_zgl]}")
print(f"Naprawa: {max_naprawa[najwiekszy_zgl]}")
print(f"Czas: {najwieksza_roznica / 3600:.1f} h")

**Wynik:**
Zgłoszenie: 2087
Awaria: 2015-11-06 12:38:46
Naprawa: 2015-11-13 12:38:32
Czas: ~167 h (~7 dni)

## Sposób 3 - arkusz kalkulacyjny

1. awarie.txt: kolumna A = nr_zgl, B = nr_kom, C = czas_awarii, D = priorytet.
2. naprawy.txt: kolumna A = nr_zgl, B = czas_naprawy, C = rodzaj.
3. W awarie dodaj E = `=MAKS.WARUNKÓW(naprawy!B:B; naprawy!A:A; A2)` (max czas_naprawy dla tego nr_zgl).
4. F = `=E2 - C2` (czas trwania, jako liczba dni - format "liczba" lub "daty").
5. Sortuj F malejąco. Pierwsze wiersz: nr_zgl 2087.

## Reference informatyczny - agregacja MAX z różnicy dat

> Reference - Operacje na czasie (timestamp):
> - **Format ISO**: `YYYY-MM-DD HH:MM:SS` - sortuje leksykograficznie = chronologicznie.
> - **Python**: `datetime.strptime()` + `total_seconds()`.
> - **C++**: `std::chrono` lub konwersja na sekundy od epoki.
> - **SQL**: `julianday()`, `TIMESTAMPDIFF()`, `EXTRACT(EPOCH FROM )`.
>
> Reference - "Najdłużej trwająca awaria":
> - Czas trwania = MAX(czas_naprawy) - czas_awarii.
> - Awaria może mieć wiele napraw - ostatnia decyduje.
> - GROUP BY na poziomie awarii (Numer_zgloszenia).

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.4, max 3 pkt):
> - **1 pkt** za prawidłowy numer zgłoszenia (2087)
> - **1 pkt** za prawidłowy czas wystąpienia awarii
> - **1 pkt** za prawidłowy czas zakończenia ostatniej naprawy
> - **0 pkt** - błędne lub brak

## Typowe pułapki

- **Liczenie czasu do PIERWSZEJ naprawy** zamiast OSTATNIEJ - błędne.
- **Pominięcie awarii bez naprawy** - niektóre awarie mogą nie mieć wpisu w naprawy.txt; powinny być pominięte.
- **Format daty** - CKE pokazuje 06-11-2015 (DD-MM-YYYY), ale plik ma ISO (2015-11-06). Konwertuj przy wyświetlaniu.
- **Porównanie stringami** - działa dla ISO timestampów, NIE dla DD-MM-YYYY ("06-11-2015" < "13-11-2015" zgodnie z prefiksem, ale "06-11-2015" > "05-12-2015" mimo że chronologicznie odwrotnie).
- **MAX bez GROUP BY** - daje tylko globalny max, nie per awaria.

## Złożoność obliczeniowa

- Wczytanie 2 plików: O(A + N).
- Agregacja: O(N) dla maksimum naprawy per zgłoszenie.
- Znalezienie max różnicy: O(A).
- **Łącznie: O(A + N).**

## Linki

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

## Podobne zadania

- [Zadanie 5.1](https://matura.lol/question/informatyka-2017-czerwiec-matura-rozszerzona-2/zad/5.1) — Zadanie 5.1. (0-4) a) Podaj, jaką wartość w roku 2017 ma samochód Volvo FH o numerze rejestracyjnym ERA 092 TR oraz jego kwotę amortyzacji wynikającą z upływu c
- [Zadanie 6.4](https://matura.lol/question/informatyka-2018-maj-matura-rozszerzona-2/zad/6.4) — Kontekst - patrz zadanie 6.1. Znajdź awarię, której usunięcie trwało najdłużej (czas liczymy od wystąpienia awarii do momentu zakończenia ostatniej z napraw, ja

_Ostatnia aktualizacja danych: 2026-10-03_
