Сначала определите дату первого бана, затем суммируйте только покупки раньше неё и отберите SUM(price)>5000. Группируйте по id, чтобы не объединить однофамильцев.
Пользователи с покупками свыше 5000 до получения бана
Сначала определите дату первого бана, затем суммируйте только покупки раньше неё и отберите 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. Это политика первого бана, не анализ периодов разблокировки.