-- Задание 1 CREATE MATERIALIZED VIEW mv_category_revenue AS SELECT p.category, sum(oi.quantity * oi.price_at_purchase) AS total_revenue FROM mnoskov.products p JOIN mnoskov.order_items oi ON p.id = oi.product_id JOIN mnoskov.orders o ON oi.order_id = o.id WHERE o.status = 'paid' GROUP BY p.category ORDER BY total_revenue desc; -- удобнее иметь wiev, чтобы небыло дублирования кода, и чтобы легко обращаться к запросу не переписывая все заново -- Задание 2 CREATE MATERIALIZED VIEW mv_user_activity AS SELECT u.id AS user_id, u.name AS user_name, count(*) AS orders_count FROM mnoskov.users u JOIN mnoskov.orders o ON u.id = o.user_id WHERE o.status = 'paid' GROUP BY u.id, u.name HAVING count(*) > 0 ORDER BY orders_count desc; -- Чем больше у пользователя заказов тем он более 'лояльный' -- Тогда будет отображаться статистика только за последний месяц - 30 дней -- Задание 3 CREATE MATERIALIZED VIEW mv_daily_revenue AS SELECT o.order_date::date AS sales_date, sum(oi.quantity * oi.price_at_purchase) AS daily_revenue FROM mnoskov.orders o JOIN mnoskov.order_items oi ON o.id = oi.order_id WHERE o.status = 'paid' GROUP BY o.order_date ORDER BY sales_date; -- Можно построить график, и видеть пики с просадками -- Быстрее считать выручку из mv_daily_revenue, тк витрина уже готова, и её не нужно высчитывать -- Задание 4 REFRESH MATERIALIZED VIEW mv_daily_revenue; -- 1. интернет‑магазин с несколькими заказами в день - каждые сутки в 8 утра например -- 2. крупный магазин с тысячами заказов в час - каждые 30 минут -- Слишком редкий REFRESH сделает витрину бесполезной для аналитиков -- Обновлять каждую секунжу нельзя, тк это тратит ресурсы компьютера, и тогда уж проще просто VIEW сделать, и вызывать когда надо