added file with views rasks
This commit is contained in:
@@ -0,0 +1,78 @@
|
|||||||
|
--task 1
|
||||||
|
--Задание 1. Витрина выручки по категориям
|
||||||
|
CREATE MATERIALIZED VIEW mv_category_revenue AS
|
||||||
|
SELECT
|
||||||
|
p.category,
|
||||||
|
SUM(oi.quantity * oi.price_at_purchase) AS total_revenue
|
||||||
|
FROM products p
|
||||||
|
JOIN order_items oi
|
||||||
|
ON oi.product_id = p.id
|
||||||
|
JOIN orders o
|
||||||
|
ON o.id = oi.order_id
|
||||||
|
WHERE o.status = 'paid'
|
||||||
|
GROUP BY p.category
|
||||||
|
ORDER BY total_revenue DESC;
|
||||||
|
/*Чем удобно иметь готовую витрину по категориям, вместо того чтобы каждый раз писать JOIN по трём таблицам?
|
||||||
|
Тем что не нужно постоянно писать запросы, которые используешь часто, достаточно один раз написать верный view и не париться, больше останется времени на остальную работу.
|
||||||
|
*/
|
||||||
|
|
||||||
|
--task 2
|
||||||
|
--Задание 2. Витрина активности пользователей
|
||||||
|
CREATE MATERIALIZED VIEW mv_user_activity AS
|
||||||
|
SELECT
|
||||||
|
o.user_id AS user_id,
|
||||||
|
u.name AS user_name,
|
||||||
|
COUNT(*) AS orders_count
|
||||||
|
FROM users u
|
||||||
|
JOIN orders o
|
||||||
|
ON o.user_id = u.id
|
||||||
|
WHERE o.status = 'paid'
|
||||||
|
GROUP BY o.user_id, u.name
|
||||||
|
ORDER BY orders_count DESC;
|
||||||
|
|
||||||
|
/*Как по такой витрине найти «самых лояльных» клиентов?
|
||||||
|
Выбрать тех у кого оплаченных заказов наибольшее количество
|
||||||
|
|
||||||
|
Что будет, если считать активность не по всем заказам, а только за последние 30 дней — как изменится смысл витрины?
|
||||||
|
В таком случае мы будем видеть самых горячих клиентов, возможно, готовых совершить следующий заказ, но с другой стороны здесь можно и ошибаться.
|
||||||
|
*/
|
||||||
|
|
||||||
|
--task 3
|
||||||
|
--Задание 3. Витрина выручки по дням
|
||||||
|
CREATE MATERIALIZED VIEW mv_daily_revenue AS
|
||||||
|
SELECT
|
||||||
|
order_date::date AS sales_date,
|
||||||
|
SUM(quantity * price_at_purchase) AS daily_revenue
|
||||||
|
FROM orders o
|
||||||
|
JOIN order_items oi
|
||||||
|
ON o.id = oi.order_id
|
||||||
|
GROUP BY o.order_date::date
|
||||||
|
ORDER BY sales_date;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Как по такой витрине заметить «просадки» и «пики» продаж?
|
||||||
|
видно будет в какой день какая выручка.
|
||||||
|
|
||||||
|
Что быстрее: считать выручку «на лету» из сырых таблиц или читать из mv_daily_revenue? Почему?
|
||||||
|
конечно же из mv_daily_revenue, потому что это таблица , которая уже создана, это быстрее, но минус в том, что она не обновляется, пока не сделаешь refresh самостоятельно.
|
||||||
|
*/
|
||||||
|
|
||||||
|
--task 4
|
||||||
|
--Задание 4. Обновление витрин
|
||||||
|
|
||||||
|
REFRESH MATERIALIZED VIEW mv_category_revenue;
|
||||||
|
|
||||||
|
/*Для интернет‑магазина с несколькими заказами в день я бы внедрил автоматическое обновление как можно чаще,
|
||||||
|
например, ежечасно, возможно получится обнаружить какие-то определенные паттерны у пользователей, чтобы
|
||||||
|
попробовать увеличить количество заказов будущем.
|
||||||
|
|
||||||
|
А для крупного магазина с тысячами заказов в час нужно внедрять систему с редкими обновлениями.
|
||||||
|
Во-первых частые обновления не смогут принести какую-то полезную информацию, а во-вторых это большая нагрузка на систему.
|
||||||
|
Для такого бизнеса важно сводить кассу к концу дня. И в конце, например, месяца формировать отчеты, когда и что больше всего покупалось.
|
||||||
|
|
||||||
|
Чем грозит слишком редкий REFRESH для отчётов (какие ошибки могут появиться в анализе)?
|
||||||
|
Слишком редкое обновление грозит тем, что не будут учтены свежие данные, соответственно выборка может быть неактуальной.
|
||||||
|
|
||||||
|
Почему нельзя обновлять витрины «каждую секунду», даже если хочется всегда свежие данные?
|
||||||
|
Потому что это дополнительная нагрузка на систему, на базу данных.
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user