🎯 Задача с собеседования

Есть таблица transactions с транзакциями клиентов. Для каждого клиента нужно посчитать выручку за последние 90 дней, а также долю выручки от топ‑3 категорий в этой сумме. При этом в отчёт должны попасть только клиенты, у которых общая выручка за период больше 50 000 ₽

Это часто попадающиеся формулировки задач на интервью, здесь проверяют сразу несколько вещей — работу с датами, оконные функции, агрегацию с фильтрацией по результату и умение не усложнять запрос лишними слоями.

Решение: WITH client_stats AS ( SELECT client_id, category, amount, SUM(amount) OVER (PARTITION BY client_id) AS total_client_revenue, RANK() OVER ( PARTITION BY client_id ORDER BY SUM(amount) OVER (PARTITION BY client_id, category) DESC ) AS category_rank FROM transactions WHERE created_at >= CURRENT_DATE - INTERVAL '90 days' ) SELECT client_id, total_client_revenue, SUM(amount) FILTER (WHERE category_rank <= 3) AS top3_categories_revenue, ROUND( 100.0 * SUM(amount) FILTER (WHERE category_rank <= 3) / NULLIF(total_client_revenue, 0), 2 ) AS top3_share_pct FROM client_stats GROUP BY client_id, total_client_revenue HAVING total_client_revenue > 50000 ORDER BY total_client_revenue DESC;

Если сразу решишь такое на собесе, покажешь свой сильный навык в SQL: ✅ Фильтрация по итоговой метрике через HAVING — сразу видно понимание разницы между WHERE и HAVING. ✅ Доля топ‑3 считается без отдельного подзапроса — логика в одном слое, легко читать и поддерживать. ✅ Используется FILTER для наглядности и эффективности, а NULLIF страхует от деления на ноль. ✅ Работа с окном по 90 дням и ранжирование категорий — типичный паттерн для продуктовой аналитики.

Ставь реакции если пост полезен 😉