Контракты с условиями по продажам

Senior SQL E-commerce

Условие задания

**Контекст:** Задание по мотивам реального тестового в Ozon. Финансовый аналитик проверяет контракты агентств на соответствие трём критериям для продления.

**Данные:**

[см. код в задании]

**Задание:**

Найдите контракты, которые одновременно удовлетворяют ВСЕМ трём условиям:

1. **Минимальный оборот:** продажи за предыдущий месяц (январь 2025) ≥ 50 000
2. **Диверсификация:** ни один клиент не даёт более 60% от общих продаж контракта за весь период
3. **Масштаб:** у агентства не менее 10 уникальных клиентов по данному контракту

Выведите contract_id, agency_id, jan_sales, max_client_share, unique_clients

Пример данных

Структура для ориентира — реальные значения из эталонного решения.

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    dt DATE NOT NULL,
    amt NUMERIC(12,2) NOT NULL,
    client_id INT NOT NULL,
    agency_id INT NOT NULL,
    contract_id INT NOT NULL
);

INSERT INTO sales (dt, amt, client_id, agency_id, contract_id) VALUES
-- Агентство 1, контракт 501 (январь: 62k, февраль: разные клиенты, 12 уникальных клиентов)
('2025-01-05', 8000,  1,  1, 501), ('2025-01-10', 7000,  2,  1, 501),
('2025-01-15', 9000,  3,  1, 501), ('2025-01-20', 6000,  4,  1, 501),
('2025-01-25', 8500,  5,  1, 501), ('2025-01-28', 5500,  6,  1, 501),
('2025-01-30', 9000,  7,  1, 501), ('2025-01-31', 9000,  8,  1, 501),
('2025-02-05', 7000,  1,  1, 501), ('2025-02-10', 8000,  9,  1, 501),
('2025-02-15', 6500,  10, 1, 501), ('2025-02-20', 7500,  11, 1, 501),
('2025-02-25', 5000,  12, 1, 501), ('2025-02-28', 6000,  2,  1, 501),
-- Агентство 2, контракт 502 (январь: 55k, один клиент > 60%)
('2025-01-05', 35000, 20, 2, 502), ('2025-01-15', 10000, 21, 2, 502),
('2025-01-25', 10000, 22, 2, 502),
('2025-02-05', 8000,  20, 2, 502), ('2025-02-15', 7000,  23, 2, 502),
-- Агентство 3, контракт 503 (6 клиентов — меньше 10)
('2025-01-10', 12000, 30, 3, 503), ('2025-01-20', 11000, 31, 3, 503),
('2025-01-28', 13000, 32, 3, 503),
('2025-02-05', 9000,  33, 3, 503), ('2025-02-15', 10000, 34, 3, 503),
('2025-02-25', 8000,  35, 3, 503);

Темы

CTE HAVING подзапросы множественные условия агрегация

Подсказки

Все тестовые задания →

Частые вопросы

Какой уровень знаний нужен для задачи "Контракты с условиями по продажам"?

Это задание для уровня Senior. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.

На каких собеседованиях встречается такая задача?

Подобные задания в категории «SQL» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: CTE, HAVING, подзапросы, множественные условия, агрегация.

Сколько времени даётся на решение?

На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.

Где ещё потренироваться по теме «SQL»?

На zasqlpython.ru есть 425 SQL задач в песочнице с автопроверкой кода, конспекты SQL для аналитика, AI мок-собеседование с разбором ваших ответов.

← Все задания