← Практика

📝 Тестовые задания

Реальные задачи с тестовых заданий от компаний — Яндекс, Kaspi, Magnum, Choco. Каждое с разбором: что хотят увидеть, как подать, типичные ошибки.

📌 powerbi · 4

CALCULATE + FILTER: выручка только по Алматы
## Сценарий В Power BI модели есть таблица `orders` с полем `city` (город покупателя) и полем `amount` (сумма заказа). Отчёт уже содержит меру `Выр
medium
Временная аналитика: выручка за предыдущий месяц
## Сценарий В отчёте Power BI уже есть: - Мера `Выручка = SUM(orders[amount])` - Таблица дат `DateTable` с отмеченным полем даты (Mark as Date Table
medium
Звёздная схема: опиши связи между таблицами
## Сценарий Ты строишь модель данных в Power BI для анализа продаж казахстанского маркетплейса. У тебя есть четыре таблицы: **Таблица `orders` (фак
medium
DAX: доля выручки категории от общего итога
## Сценарий В отчёте Power BI таблица `orders` содержит поля `amount` и внешний ключ `product_id`. Таблица `products` содержит поле `category`. Обе
hard

🗄 SQL · 29

Заказы клиентов через JOIN
Две таблицы: - `customers` — клиенты (`id`, `name`) - `orders` — заказы (`id`, `customer_id`, `total`) Напиши запрос, который покажет **имя клиента
medium
Клиенты без заказов (LEFT JOIN)
В таблицах `customers` и `orders` найди клиентов, у которых **нет ни одного заказа**. Колонка в результате: `name`. Сортировка не важна (но в эталон
medium
Топ-1 заказ в каждом городе (оконные функции)
Таблицы те же, но `customers` теперь с городом (`id`, `name`, `city`). В каждом **городе** найди клиента с **самым большим единичным заказом**. Коло
hard
Классификация сотрудников через CASE WHEN
В таблице `employees` есть колонки `id`, `name`, `salary`. Напиши запрос, который вернёт три колонки: `name`, `salary` и `level`, где `level` опреде
medium
Выручка по месяцам через DATE_TRUNC
В таблице `orders` хранятся заказы с колонками `id`, `created_at` (тип timestamp), `amount`. Напиши запрос, который вернёт **суммарную выручку по ка
medium
Накопительная сумма через оконную функцию
В таблице `orders` есть колонки `user_id`, `order_date`, `amount`. Напиши запрос с **накопительной суммой** заказов для каждого пользователя. Колонк
medium
Первый заказ каждого пользователя (ROW_NUMBER)
В таблице `orders` (`id`, `user_id`, `order_date`, `amount`) найди **первый заказ каждого пользователя** (по дате). Верни: `user_id`, `order_date`,
medium
Пользователи без заказов (LEFT JOIN + IS NULL)
Две таблицы: - `users` — `id`, `name` - `orders` — `id`, `user_id`, `amount` Найди пользователей, у которых **нет ни одного заказа**. Верни: `user_
medium
CTE: активные пользователи + их LTV
Две таблицы: - `sessions` — `user_id`, `session_at` (дата сессии) - `orders` — `user_id`, `amount` Используй **CTE**, чтобы найти пользователей, кот
hard
Категории с выручкой > 20K
В Magnum `sales` за май. Найди **категории у которых суммарная выручка > 20,000**. Колонки: `category`, `total`. Отсортируй по `total DESC`. **Подс
medium
Накопительный итог (running total)
В Каспи Pay по клиенту 1 (Айгерим) есть 5 транзакций: | txn_id | date | amount | |--------|------------|--------| | 1 | 2026-05-01 | 5000
medium
Самый дорогой заказ каждого клиента
В таблице `orders`: | id | customer | amount | |----|----------|--------| | 1 | Айгерим | 5000 | | 2 | Айгерим | 12000 | | 3 | Ерлан | 80
hard
CTE: помесячная выручка с pct change
В Каспи Магазин по месяцам: | month | revenue | |---------|---------| | 2026-01 | 1000000 | | 2026-02 | 1100000 | | 2026-03 | 1300000 | | 2026-04
hard
Self-join: пары сотрудников из одного города
В Halyk таблица `employees`: | id | name | city | |----|---------|---------| | 1 | Айгерим | Алматы | | 2 | Ерлан | Астана | | 3 | Дана
hard
CASE WHEN: сегментация клиентов
В таблице `customers` у каждого клиента `total_spent`: | id | name | total_spent | |----|---------|-------------| | 1 | Айгерим | 5000 |
medium
HAVING COUNT: активные клиенты
В таблице `orders`: | id | customer | amount | |----|----------|--------| | 1 | Айгерим | 5000 | | 2 | Айгерим | 3000 | | ...| |
medium
EXISTS: клиенты с покупками >10K
Две таблицы: - `customers` (id, name) - `orders` (id, customer_id, amount) Найди клиентов **у которых есть хотя бы один заказ на сумму > 10000**. Ко
medium
Вторая по величине зарплата
В Halyk таблица `employees`: | id | name | salary | |----|---------|--------| | 1 | Айгерим | 500000 | | 2 | Ерлан | 700000 | | 3 | Дана
medium
Медиана зарплаты по городам
В Magnum таблица `employees(name, city, salary)`. Посчитай **медианную** зарплату по каждому городу. Колонки в результате: `city`, `median_salary`.
hard
Подряд идущие дни активности (islands)
В Каспи у клиента таблица `activity`: | user_id | date | |---------|------------| | 1 | 2026-05-01 | | 1 | 2026-05-02 | | 1
hard
Pivot руками: выручка по месяцам
В таблице `sales(month, category, amount)`. Преврати в **wide format**: строки — категории, колонки — месяцы. ``` category | Jan | Feb | Mar -------
medium
7-day rolling average DAU
В Каспи таблица `dau(day, count)` — дневная аудитория. Посчитай **7-day скользящее среднее** для каждого дня (для первых дней — среднее по доступным)
hard
Накопительные уникальные клиенты
В Каспи Магазин таблица заказов `orders(date, customer_id)`. Посчитай для каждого дня **сколько уникальных клиентов** делали покупки **за всё время д
hard
Лучший продавец каждого месяца
В Magnum таблица `sales(month, seller_name, total)`. Для каждого **месяца** найди продавца с **максимальной выручкой** (если ничья — любого, но детер
medium
Топ 10% клиентов по выручке
В Glovo таблица `customers(id, name, total_spent)`. Найди **топ-10% клиентов** по суммарной потраченной сумме. Колонки: `name`, `total_spent`. Отсорт
hard
Какой день недели приносит больше заказов
В Каспи `orders(date, amount)`. Посчитай для каждого **дня недели** (Mon=1, Sun=7) сумму всех заказов. Колонки: `dow` (number 1-7), `total`. Отсорти
medium
Anti-join: что нет в правой таблице
В Каспи есть две таблицы: - `all_users` (id, name) — все зарегистрированные - `active_users` (user_id) — кто заходил последний месяц Найди клиентов
medium
Сравнить продажи с предыдущим заказом клиента
В Каспи `orders(id, customer, amount, created_at)`. Для каждого заказа покажи: - `id`, `customer`, `amount` - `prev_amount` — сумма **предыдущего** з
hard
Recursive CTE: числа Фибоначчи
Используя `WITH RECURSIVE`, сгенерируй первые **10 чисел Фибоначчи**: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55. Колонки: `n` (порядковый номер от 1), `fib`
hard

📌 excel · 2

ЕСЛИ + ИЛИ: формула расчёта бонуса
## Сценарий В таблице HR-отдела данные по сотрудникам (строка 2 — первый сотрудник): | A: имя | B: выполнение плана (%) | C: стаж (лет) | D: бонус
medium
ИНДЕКС+ПОИСКПОЗ: гибкий поиск лучше ВПР
## Сценарий Таблица с данными о продажах менеджеров расположена так: **Диапазон A1:C6 (Лист «Данные»):** | A: менеджер | B: город | C: выручка (₸)
medium

🐍 Python · 15

Pandas: groupby — средняя зарплата по городам
В DataFrame `df` посчитай **среднюю зарплату по каждому городу**. `result` должен быть DataFrame со столбцами `city` и `avg_salary`, отсортированный
medium
Pandas: merge клиентов с заказами
Два DataFrame: - `customers` (`id`, `name`) - `orders` (`id`, `customer_id`, `total`) Сделай **INNER merge** — для каждого заказа подставь имя клие
medium
Pandas: заполнить NaN средним по колонке
В DataFrame `df` колонка `salary` содержит пропуски (`NaN`). Замени все `NaN` на **среднее значение** этой колонки (без учёта самих NaN). `result` —
medium
Pandas: топ-1 заказ в каждом городе
Два DataFrame: `customers` (`id`, `name`, `city`) и `orders` (`customer_id`, `total`). В каждом **городе** найди клиента с **самым большим единичным
hard
Сводная таблица продаж по категориям
Дан DataFrame `df` с колонками `date` (тип datetime), `category`, `amount`. Создай **сводную таблицу (pivot table)**: - Строки = категория (`categor
medium
RFM сегментация: ярлык клиента
Дан DataFrame `df` с клиентами Каспи Магазина: | customer | recency_days | freq | monetary | |----------|--------------|------|----------| | Айгерим
medium
Pivot table: long → wide
DataFrame `df` транзакций: | customer | month | amount | |----------|-------|--------| | Айгерим | Jan | 5000 | | Айгерим | Feb | 7000 | |
medium
Funnel conversion rates
DataFrame `df` с событиями: | user_id | event | |---------|-------------------| | 1 | visit | | 1 | cart
medium
Месячная выручка через resample()
Дан DataFrame `df` с колонками `date` (индекс, тип datetime) и `revenue` (дневная выручка). Используй `resample()` чтобы получить **суммарную выручк
medium
7-day rolling average DAU
DataFrame `df` с дневным DAU: | date | dau | |------------|-------| | 2026-05-01 | 1000 | | 2026-05-02 | 1100 | | ... | | До
medium
Удаление выбросов методом IQR
Дан DataFrame `df` с колонками `name` и `salary`. Удали **выбросы** из колонки `salary` методом IQR: - Q1 = 25-й перцентиль, Q3 = 75-й перцентиль -
medium
Рост выручки месяц к месяцу (MoM)
Дан DataFrame `df` с колонками `month` и `revenue` (месячная выручка). Рассчитай **прирост выручки месяц к месяцу** (MoM growth %) с помощью `pct_ch
medium
Cohort retention простой
DataFrame событий покупки: | user_id | month | |---------|-------| | 1 | 1 | | 1 | 2 | | 1 | 4 | | 2 | 1 | |
hard
IQR outliers
DataFrame с временем доставки Glovo: | order_id | delivery_min | |----------|--------------| | 1 | 25 | | 2 | 30 |
medium
Регулярка: нормализовать телефоны KZ
Дан DataFrame `df` с колонкой `phone` — разные форматы: ``` +7 (777) 123-45-67 8 777 1234567 77771234567 +77771234567 8 (777) 123 45 67 ``` Преврат
medium