66 lines
2.3 KiB
SQL
66 lines
2.3 KiB
SQL
-- Задание 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 сделать, и вызывать когда надо |