Files
homework/mnoskov/postgresql/8. Представления и витрины данных/DQL_views_practice.sql
T

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