Пользователи с покупками свыше 5000 до получения бана

Сначала определите дату первого бана, затем суммируйте только покупки раньше неё и отберите SUM(price)>5000. Группируйте по id, чтобы не объединить однофамильцев.

Короткий ответ

Что ответить на собеседовании

Сначала определите дату первого бана, затем суммируйте только покупки раньше неё и отберите SUM(price)>5000. Группируйте по id, чтобы не объединить однофамильцев.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо определить тех клиентов, у которых суммарная стоимость покупок превысила 5000 до даты блокировки их аккаунта. Вывести результаты в виде: идентификатор | имя | фамилия | общая сумма покупок.

Table "user"
+----+-----------+----------+------------+
| id | firstname | lastname | birth      |
+----+-----------+----------+------------+
| 1  | Ivan      | Petrov   | 1996-05-01 |
| 2  | Anna      | Petrova  | 1999-06-01 |
| 3  | Anna      | Petrova  | 1990-10-02 |
+----+-----------+----------+------------+

Table "purchase"
+-----+-------+---------+------------+
| sku | price | user_id | date       |
+-----+-------+---------+------------+
| 1   | 5500  | 1       | 2021-02-15 |
| 1   | 5700  | 1       | 2021-01-15 |
| 2   | 4000  | 1       | 2021-02-14 |
| 3   | 8000  | 2       | 2021-03-01 |
| 4   | 400   | 2       | 2021-03-02 |
+-----+-------+---------+------------+

Table "ban_list"
+---------+------------+
| user_id | date_from  |
+---------+------------+
| 1       | 2021-03-08 |
+---------+------------+

Ответ

Сначала определите дату первого бана, затем суммируйте только покупки раньше неё и отберите SUM(price)>5000. Группируйте по id, чтобы не объединить однофамильцев.

Если нужны и пользователи, которых никогда не банили:

WITH bans AS (
    SELECT user_id, MIN(date_from) AS banned_at
    FROM ban_list
    GROUP BY user_id
)
SELECT u.id, u.firstname, u.lastname, SUM(p.price) AS total
FROM "user" AS u
JOIN purchase AS p ON p.user_id = u.id
LEFT JOIN bans AS b ON b.user_id = u.id
WHERE b.banned_at IS NULL OR p.date < b.banned_at
GROUP BY u.id, u.firstname, u.lastname
HAVING SUM(p.price) > 5000
ORDER BY u.id;

В примере получится Ivan Petrov — 15200 и Anna Petrova с id=2 — 8400. Если требуются только забаненные, используйте INNER JOIN bans и уберите ветку IS NULL. Это политика первого бана, не анализ периодов разблокировки.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее