# Informatyka — zadanie 6.2

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2019-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 2019 (rozszerzona)
- rok: 2019
- poziom: rozszerzona
- typ: open
- punkty: 3
- działy: Bazy danych

## Treść

Kontekst - patrz zadanie 6.1.

Podaj listę różnych rodzin zapachów. Dla każdej rodziny podaj jej nazwę, cenę najtańszych perfum z tej rodziny i ich nazwę.

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

## Poprawna odpowiedź

**18 rodzin zapachów z najtańszymi perfumami:**

| Rodzina zapachów | Cena | Nazwa |
| aromatyczna | 124 | Ibrary Ollec D'amore |
| cytrusowa | 259 | Sian Grad |
| cytrusowo-aromatyczna | 178 | Re Nostrum,ir |
| drzewna | 123 | Pperlee Bouquet |
| kwiatowa | 110 | Ose Deurmaline |
| kwiatowo-drzewna | 104 | Rougna |
| kwiatowo-orientalna | 103 | Arla : Vivace |
| kwiatowo-szyprowa | 287 | Etish Pothal |
| orientalna | 113 | Anille La Tosca |
| orientalna lagodna | 122 | Ndy Warhol S Rose |
| orientalno-drzewna | 138 | LackNight |
| owocowa | 154 | Ake Perfucturne |
| pudrowa | 139 | Ivm Cristal |
| skorzana | 112 | Ui Mare |
| szyprowa | 226 | Usk ti 1888 |
| szyprowo-skorzana | 158 | Uir OtPlace |
| wodna | 146 | Ilver Mounaya |
| zielona | 406 | EOman |

## Sposób 1 - SQL z podzapytaniem (najtańsze per rodzina)

```sql
SELECT p.rodzina_zapachow, p.cena, p.nazwa_p
FROM perfumy p
INNER JOIN (
SELECT rodzina_zapachow, MIN(cena) AS min_cena
FROM perfumy
GROUP BY rodzina_zapachow
) m ON p.rodzina_zapachow = m.rodzina_zapachow AND p.cena = m.min_cena
ORDER BY p.rodzina_zapachow;

**Wyjaśnienie:** Podzapytanie znajduje najniższą cenę per rodzina. JOIN z tabelą perfumy daje też nazwę produktu o tej cenie.

## Sposób 2 - Python z agregacją

```python
from collections import defaultdict

najtansze = {} # rodzina -> (cena, nazwa)

with open('perfumy.txt', encoding='utf-8') as f:
f.readline()
for linia in f:
pola = linia.strip().split('\t')
id_p, nazwa, id_m, rodzina, cena = pola
cena = int(cena)
if rodzina not in najtansze or cena < najtansze[rodzina][0]:
najtansze[rodzina] = (cena, nazwa)

for rodzina in sorted(najtansze):
cena, nazwa = najtansze[rodzina]
print(f'{rodzina:30} {cena:5} {nazwa}')

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

**Wariant 1 (tabela przestawna):**
1. Wstaw → Tabela przestawna.
2. Wiersze: `rodzina_zapachow`.
3. Wartości: `cena` z funkcją MIN.

To daje rodzinę + minimalną cenę. Aby uzyskać nazwę produktu - INDEX/MATCH:

=INDEKS(perfumy!B:B; PODAJ.POZYCJĘ(1; (perfumy!D:D=A2)*(perfumy!E:E=B2); 0))
(formuła tablicowa, Ctrl+Shift+Enter)

## Reference informatyczny - GROUP BY z dodatkowymi kolumnami

> Reference - Typowy problem "min/max group_by z innym polem":
> - SQL standard: GROUP BY zwraca tylko grupę + agregat. Aby dodać inną kolumnę (np. nazwa_p), potrzebujemy podzapytania lub window function.
> - Podzapytanie: `JOIN (SELECT rodzina, MIN(cena) FROM perfumy GROUP BY rodzina) ON `.
> - Window function (nowoczesny SQL): `ROW_NUMBER() OVER (PARTITION BY rodzina ORDER BY cena ASC) = 1`.
> - Python defaultdict z iteracyjnym update - najwygodniej.

## Schemat oceniania CKE

> Klucz CKE (zadanie 6.2, max 3 pkt):
> - **1 pkt** - prawidłowa lista 18 rodzin zapachów
> - **1 pkt** - cena najtańszych perfum dla każdej rodziny
> - **1 pkt** - nazwa najtańszych perfum dla każdej rodziny
> - **0 pkt** - błędna lub brak

## Typowe pułapki

- **`SELECT rodzina, MIN(cena), nazwa_p`** - bez podzapytania! W standardowym SQL to BŁĄD (nazwa_p nie jest w GROUP BY i nie jest agregatem).
- **Brak DISTINCT** - duplikaty rodzin jeśli ta sama rodzina ma kilka perfum o tej samej minimalnej cenie.
- **Sortowanie** - nie jest wymagane przez treść, ale ułatwia czytanie.
- **Pomylenie kolumn** - w perfumy.txt: id_perfum, nazwa_p, id_marki, rodzina_zapachow, cena.

## Złożoność obliczeniowa

- SQL z indeksem na rodzina_zapachow: O(n log n) sortowanie + O(n) join.
- Python defaultdict: O(n) - n = liczba perfum.
- Wynik: 18 rodzin (z danych).

## Linki

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

## Podobne zadania

- [Zadanie 6.3](https://matura.lol/question/informatyka-2018-maj-matura-rozszerzona-2/zad/6.3) — Kontekst - patrz zadanie 6.1. Pewnego dnia nastąpiła awaria wszystkich komputerów w jednej z sekcji. Podaj datę awarii oraz symbol sekcji, w której nastąpiła aw
- [Zadanie 5.2](https://matura.lol/question/informatyka-2016-maj-matura-stara-podstawowa-2/zad/5.2) — Zadanie 5.2. (2 pkt) Podaj nazwy produktów zakupionych przez klienta Anna Kotnicka, grupy towarowe oraz producentów tych produktów. Poziom podstawowy MIN_2P
- [Zadanie 5.5](https://matura.lol/question/informatyka-2016-czerwiec-matura-rozszerzona-2/zad/5.5) — Zadanie 5.5. (0-2) Podaj imię i nazwisko najmłodszego maturzysty oraz nazwy przedmiotów dodatkowych, które ta osoba wybrała na egzaminie maturalnym.
- [Zadanie 6.1](https://matura.lol/question/informatyka-2015-maj-matura-stara-podstawowa-2/zad/6.1) — Zadanie 6.1. (2 pkt) Podaj imię i nazwisko osoby, której numer konta rozpoczyna się od 49.

_Ostatnia aktualizacja danych: 2026-10-03_
