Задание 3: анализ табличных баз данных
Задание 3 (базовый уровень): фильтрация и подсчёт записей в табличной базе данных.
Табличная база данных — это одна или несколько связанных таблиц, где строки (записи) описывают объекты, а столбцы (поля) — их свойства. Задание 3 проверяет умение находить записи по условиям.
Что проверяет задание
В задании 3 даётся база данных в файле .ods (электронная таблица) — обычно одна или две связанные таблицы. Нужно ответить на вопрос вида «сколько записей удовлетворяют условию» или «найти суммарное/максимальное значение поля для отобранных строк». Это самое «офисное» задание: его естественно решать в LibreOffice Calc через фильтры и функции. Но для тренировки логики удобно разобрать тот же подход на Python.
Одна таблица: фильтрация и подсчёт
Пусть есть таблица товаров на складе. Вопрос: сколько товаров с количеством больше 20 и ценой меньше 50? В электронной таблице это делается функцией СЧЁТЕСЛИМН (COUNTIFS) или автофильтром. На Python — списковым включением:
rows = [
{"товар": "А", "кол": 50, "цена": 12},
{"товар": "Б", "кол": 30, "цена": 40},
{"товар": "В", "кол": 80, "цена": 5},
{"товар": "Г", "кол": 10, "цена": 100},
{"товар": "Д", "кол": 25, "цена": 60},
]
sel = [r for r in rows if r["кол"] > 20 and r["цена"] < 50]
print("подходящих записей:", len(sel))
print("товары:", [r["товар"] for r in sel])
Вывод:
подходящих записей: 3 товары: ['А', 'Б', 'В']
Агрегаты: сумма, максимум, среднее
Вторая частая разновидность — посчитать суммарное или максимальное значение по отобранным записям. В таблицах это СУММЕСЛИ/СУММЕСЛИМН (SUMIFS), МАКС (MAX); на Python — встроенные sum, max:
rows = [
{"товар": "А", "кол": 50, "цена": 12},
{"товар": "Б", "кол": 30, "цена": 40},
{"товар": "В", "кол": 80, "цена": 5},
{"товар": "Г", "кол": 10, "цена": 100},
]
# суммарное количество товаров дешевле 50 рублей
sel = [r for r in rows if r["цена"] < 50]
print("суммарное количество:", sum(r["кол"] for r in sel))
print("максимальная цена среди них:", max(r["цена"] for r in sel))
Вывод:
суммарное количество: 160 максимальная цена среди них: 40
Две связанные таблицы
Чаще в задании 3 две таблицы, связанные общим ключом. Например, таблица «Сотрудники» (ID, имя, ID_отдела) и таблица «Отделы» (ID_отдела, название, город). Вопрос: сколько сотрудников работает в отделах города «Казань»? Это операция соединения (JOIN): по каждому сотруднику находим его отдел и проверяем город.
otdely = {
1: {"назв": "Продажи", "город": "Казань"},
2: {"назв": "Логистика", "город": "Москва"},
3: {"назв": "ИТ", "город": "Казань"},
}
sotrudniki = [
{"имя": "Аня", "otdel": 1},
{"имя": "Боря", "otdel": 2},
{"имя": "Вера", "otdel": 3},
{"имя": "Гриша", "otdel": 1},
{"имя": "Дима", "otdel": 2},
]
# сотрудники, чей отдел в Казани
sel = [s for s in sotrudniki if otdely[s["otdel"]]["город"] == "Казань"]
print("сотрудников в Казани:", len(sel))
print("это:", [s["имя"] for s in sel])
Вывод:
сотрудников в Казани: 3 это: ['Аня', 'Вера', 'Гриша']
Сортировка и поиск экстремумов
Часть вопросов задания 3 связана с порядком: «какой товар на третьем месте по цене», «найдите запись с максимальным значением среди отобранных». В таблицах это сортировка столбца, на Python — функция sorted с ключом. Разберём: «Среди товаров дороже 10 рублей найдите второй по величине запас (поле "кол")».
rows = [
{"товар": "А", "кол": 50, "цена": 12},
{"товар": "Б", "кол": 30, "цена": 40},
{"товар": "В", "кол": 80, "цена": 5},
{"товар": "Г", "кол": 10, "цена": 100},
{"товар": "Д", "кол": 70, "цена": 25},
]
# отбираем товары дороже 10 и сортируем по убыванию количества
sel = [r for r in rows if r["цена"] > 10]
sel.sort(key=lambda r: r["кол"], reverse=True)
print("по убыванию запаса:", [(r["товар"], r["кол"]) for r in sel])
print("второй по величине запас — товар:", sel[1]["товар"], "кол:", sel[1]["кол"])
Вывод:
по убыванию запаса: [('Д', 70), ('А', 50), ('Б', 30), ('Г', 10)]
второй по величине запас — товар: А кол: 50
Обратите внимание: товар «В» с количеством 80 в выборку не попал, потому что его цена 5 не больше 10. Это и есть типичная ловушка: сначала фильтр, потом сортировка — порядок операций важен. В электронной таблице порядок тот же: сначала автофильтр по цене, затем сортировка по столбцу количества.
Группировка: сумма по категориям
Ещё один частый вопрос — «суммарный запас по каждому поставщику» или «сколько товаров в каждой категории». В таблицах это сводная таблица или СУММЕСЛИ по каждому значению; на Python удобно собрать словарь-накопитель:
from collections import defaultdict
rows = [
{"товар": "А", "склад": "Север", "кол": 50},
{"товар": "Б", "склад": "Юг", "кол": 30},
{"товар": "В", "склад": "Север", "кол": 80},
{"товар": "Г", "склад": "Юг", "кол": 10},
{"товар": "Д", "склад": "Север", "кол": 70},
]
itog = defaultdict(int)
for r in rows:
itog[r["склад"]] += r["кол"] # накапливаем по складу
for sklad, total in itog.items():
print(sklad, "->", total)
Вывод:
Север -> 200 Юг -> 40
Как это делать в электронной таблице (реальный экзамен)
На самом экзамене базу выдают в .ods, и быстрее всего работать прямо в LibreOffice Calc:
- Подсчёт по условию — функция
СЧЁТЕСЛИМН(COUNTIFS): задаёте диапазоны и условия, получаете количество. - Сумма по условию —
СУММЕСЛИМН(SUMIFS). - Связь таблиц — функция
ВПР(VLOOKUP) подтягивает данные из второй таблицы по ключу, после чего фильтруете обычным автофильтром. - Автофильтр — для визуальной проверки: наложить условия на столбцы и посмотреть, сколько строк осталось.
Python в этом задании — резервный и тренировочный инструмент: он помогает понять логику фильтрации и связей. На реальном КЕГЭ для задания 3 чаще выбирают таблицы, потому что данные уже в .ods.
Типичные ловушки
- Строгое или нестрогое неравенство. «Больше 20» — это > 20 (без 20), «не менее 20» — это ≥ 20. Читайте формулировку точно.
- И против ИЛИ. «Количество больше 20 и цена меньше 50» — оба условия; «или» — достаточно одного.
- Связь таблиц по ключу. Не перепутайте, какое поле является ключом связи (ID отдела), а какое — просто данными.
- Дубликаты и пустые ячейки в реальной базе могут испортить подсчёт — проверяйте крайние записи.
Итог
- Задание 3 — фильтрация и подсчёт записей в табличной базе; на экзамене удобнее всего электронные таблицы (.ods).
- Подсчёт — СЧЁТЕСЛИМН, сумма — СУММЕСЛИМН, связь таблиц — ВПР; на Python это списковые включения и sum/max.
- Главные ловушки — путаница строгих/нестрогих неравенств и И/ИЛИ в условиях.