Всем привет, ну что сегодня немного порешаем задачки по SQL - это отличный шанс проверить себя по базе:

Есть:

orders
------
id
user_id
status
amount
created_at

Найти пользователей, у которых:
- минимум 5 заказов;
- минимум 3 заказа со статусом SUCCESS;
- сумма успешных заказов > 50 000;
- последний успешный заказ был совершен в последние 30 дней.

Вывести:
- user_id
- orders_count
- success_count
- success_amount
-last_success_date

Нам будут нужны 4 агрегата:
orders_count
success_count
success_amount
last_success_date

Так как нам нужно в условии задачи найти пользователей, то мы используем GROUP BY по пользователю, после отработки у нас останется одна строка на пользователя.

Дальше мы считаем показатели внутри этой группы:
- COUNT(*) FILTER (WHERE status = 'SUCCESS') - только успешные заказы
- SUM(amount) FILTER (WHERE status = 'SUCCESS') - сумма успешных заказов
- MAX(created_at) FILTER (WHERE status = 'SUCCESS') - последний успешный заказ
- фильтруем пользователей через HAVING
HAVING COUNT(*) >= 5
AND COUNT(*) FILTER (WHERE status = 'SUCCESS') >= 3
AND SUM(amount) FILTER (WHERE status = 'SUCCESS') > 50000
AND MAX(created_at) FILTER (WHERE status = 'SUCCESS')
>= CURRENT_DATE - INTERVAL '30 days'

Получаем полный вариант:
SELECT
user_id,
COUNT(*) AS orders_count,
COUNT(*) FILTER (WHERE status = 'SUCCESS') AS success_count,
SUM(amount) FILTER (WHERE status = 'SUCCESS') AS success_amount,
MAX(created_at) FILTER (WHERE status = 'SUCCESS') AS last_success_date
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5
AND COUNT(*) FILTER (WHERE status = 'SUCCESS') >= 3
AND SUM(amount) FILTER (WHERE status = 'SUCCESS') > 50000
AND MAX(created_at) FILTER (WHERE status = 'SUCCESS')
>= CURRENT_DATE - INTERVAL '30 days';
Просмотры: 29
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти