Войти Регистрация
Data base

224. Договоры без перекоса на одного клиента

Сложная

В sales — сделки рекламных агентств: дата и время dt, сумма amt, клиент, агентство и договор. Договор ведёт одно агентство. Отчёт строим 3 ноября 2025, «прошлый месяц» — октябрь 2025 целиком.

Верните contract_id и turnover_rub — оборот договора за октябрь — для договоров, где выполнено всё сразу: оборот не меньше 50 000 ₽; ни один клиент не набрал по этому договору больше 60 % его октябрьского оборота (ровно 60 % допустимо); у агентства договора за октябрь было не меньше 3 разных клиентов по всем его договорам.

Порядок — по contract_id.

В работе: Отбор договоров на бонус агентству: оборот есть, и он не держится на одном клиенте.

Таблицы

sales — одна строка — сделка

КолонкаТипЧто значит
idintключ
dttimestampдата и время сделки
amtnumericсумма, руб.
client_idintклиент
agency_idintагентство
contract_idintдоговор

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

sales · 14 строк

iddtamtclient_idagency_idcontract_id
12025-10-02T10:00:0020000101110
22025-10-05T12:00:0020000102110
32025-10-09T09:30:0015000103110
42025-10-10T11:00:0040000104111
52025-10-11T16:00:0012000101111
62025-10-12T13:00:0030000101112
72025-09-28T13:00:0040000101112
82025-10-14T10:00:0030000102113
92025-10-15T10:00:0025000103113
102025-10-16T10:00:0020000104114
112025-10-17T10:00:0020000104114
122025-10-18T10:00:0015000101114
132025-10-03T10:00:0030000201220
142025-10-04T10:00:0030000202220

Ожидаемый ответ

contract_idturnover_rub
1055000
1355000
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
contract_id, turnover_rub
CTEGROUP BYHAVINGподзапросдаты

Источник: тестовое аналитика данных (Middle) в Ozon, сборник No Data No Growth. Условие пересказано своими словами.