pet project
This commit is contained in:
47
queries/analize.sql
Normal file
47
queries/analize.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- ### ✅ **Задание 5: Напиши SQL-запросы к витринам**
|
||||
-- **Напиши свои вариации для практики.**
|
||||
-- 📌 *Ниже — примеры.*
|
||||
-- ### Топ-5 самых просматриваемых уроков
|
||||
-- SELECT
|
||||
-- lesson_title,
|
||||
-- course_title,
|
||||
-- total_views
|
||||
-- FROM lesson_popularity_summary
|
||||
-- ORDER BY total_views DESC
|
||||
-- LIMIT 5;
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT * FROM pet_project.mv_lesson_popularity_summary
|
||||
) AS top_lessons
|
||||
LIMIT 5
|
||||
;
|
||||
|
||||
WITH selected_top AS (SELECT *
|
||||
FROM pet_project.mv_lesson_popularity_summary)
|
||||
SELECT *
|
||||
FROM selected_top
|
||||
LIMIT 5
|
||||
;
|
||||
|
||||
|
||||
-- ### Неактивные пользователи, записавшиеся на курсы
|
||||
-- SELECT
|
||||
-- name,
|
||||
-- email,
|
||||
-- registered_courses_count
|
||||
-- FROM inactive_users_summary
|
||||
-- WHERE registered_courses_count > 0
|
||||
-- ORDER BY registration_date DESC;
|
||||
|
||||
-- дальше по аналогии как ВЫШЕ, подзапрос или CTE
|
||||
|
||||
-- ### Курсы с самым высоким процентом завершения
|
||||
-- SELECT
|
||||
-- course_title,
|
||||
-- AVG(completion_rate) AS avg_completion
|
||||
-- FROM course_completion_rate
|
||||
-- GROUP BY course_title
|
||||
-- ORDER BY avg_completion DESC
|
||||
-- LIMIT 5;
|
||||
|
||||
-- дальше по аналогии как ВЫШЕ, подзапрос или CTE
|
||||
59
queries/course_completion_rate.sql
Normal file
59
queries/course_completion_rate.sql
Normal file
@@ -0,0 +1,59 @@
|
||||
-- ### ✅ **Задание 4: Создай витрину `course_completion_rate`**
|
||||
--
|
||||
-- **Цель:** проанализировать, насколько хорошо пользователи проходят курсы.
|
||||
--
|
||||
-- 📌 **Что нужно сделать:**
|
||||
--
|
||||
-- - Сформируй таблицу, где строка — это пользователь + курс.
|
||||
-- - Для каждой пары нужно рассчитать:
|
||||
-- - Общее число уроков в курсе
|
||||
-- - Сколько из них просмотрел конкретный пользователь
|
||||
-- - Коэффициент завершения (`lessons_viewed / lessons_in_course`)
|
||||
--
|
||||
-- **Как использовать метрику:**
|
||||
--
|
||||
-- Можно анализировать, какие курсы чаще всего "бросают", какие хорошо проходят, где стоит улучшить структуру или добавить мотивационные механики (геймификация, рассылки и т.п.).
|
||||
WITH course_lesson AS (SELECT course_id, count() AS total_lessons
|
||||
FROM pet_project.lessons
|
||||
GROUP BY course_id)
|
||||
SELECT concat(u.name, ', ', c.title) AS user_course,
|
||||
any(cl.total_lessons) AS lessons_in_course,
|
||||
count(DISTINCT flv.lesson_id) AS lessons_viewed,
|
||||
round(count(DISTINCT flv.lesson_id) / any(cl.total_lessons), 2) AS coef
|
||||
FROM pet_project.users u
|
||||
JOIN pet_project.fact_lesson_views flv ON flv.user_id = u.user_id
|
||||
JOIN pet_project.lessons l ON l.lesson_id = flv.lesson_id
|
||||
JOIN pet_project.courses c ON c.course_id = l.course_id
|
||||
JOIN course_lesson cl ON cl.course_id = l.course_id
|
||||
GROUP BY u.name, c.title
|
||||
ORDER BY user_course
|
||||
;
|
||||
|
||||
-- создание mat view
|
||||
CREATE MATERIALIZED VIEW pet_project.mv_user_course_progress
|
||||
ENGINE = SummingMergeTree(lessons_viewed)
|
||||
ORDER BY (user_id, course_id)
|
||||
POPULATE
|
||||
AS
|
||||
SELECT flv.user_id AS user_id,
|
||||
l.course_id AS course_id,
|
||||
any(u.name) AS user_name,
|
||||
any(c.title) AS course_title,
|
||||
any(cl.total_lessons) AS lessons_in_course,
|
||||
count(DISTINCT flv.lesson_id) AS lessons_viewed,
|
||||
round(count(DISTINCT flv.lesson_id) / any(cl.total_lessons), 2) AS coef
|
||||
FROM pet_project.fact_lesson_views flv
|
||||
JOIN pet_project.users u ON u.user_id = flv.user_id
|
||||
JOIN pet_project.lessons l ON l.lesson_id = flv.lesson_id
|
||||
JOIN pet_project.courses c ON c.course_id = l.course_id
|
||||
JOIN (
|
||||
SELECT course_id, count() AS total_lessons
|
||||
FROM pet_project.lessons
|
||||
GROUP BY course_id
|
||||
) cl ON cl.course_id = l.course_id
|
||||
GROUP BY flv.user_id, l.course_id
|
||||
;
|
||||
|
||||
SELECT *
|
||||
FROM pet_project.mv_user_course_progress
|
||||
;
|
||||
46
queries/inactive_users_summary.sql
Normal file
46
queries/inactive_users_summary.sql
Normal file
@@ -0,0 +1,46 @@
|
||||
-- ### ✅ **Задание 3: Создай витрину `inactive_users_summary`**
|
||||
--
|
||||
-- **Цель:** выявить пользователей, которые **зарегистрировались, но ничего не посмотрели**.
|
||||
--
|
||||
-- 📌 **Что нужно сделать:**
|
||||
--
|
||||
-- - Подготовь таблицу, где каждая строка — один такой "неактивный" пользователь.
|
||||
-- - Для каждого пользователя нужны:
|
||||
-- - ID, имя, email, возраст
|
||||
-- - Количество курсов, на которые он записался
|
||||
-- - Дата регистрации
|
||||
-- **Где пригодится:**
|
||||
--
|
||||
-- Эта витрина может использоваться для продуктовой аналитики, триггерных рассылок (например, напоминаний), анализа оттока, повышения вовлечённости.
|
||||
SELECT u.user_id AS user_id,
|
||||
any(u.name) AS user_name,
|
||||
any(u.email) AS email,
|
||||
any(u.age) AS age,
|
||||
count() course_count,
|
||||
any(u.registration_date) AS registration_date
|
||||
FROM pet_project.users u
|
||||
LEFT JOIN pet_project.enrollments e USING (user_id)
|
||||
GROUP BY u.user_id
|
||||
ORDER BY u.user_id
|
||||
;
|
||||
|
||||
-- Создание вьюшки
|
||||
CREATE MATERIALIZED VIEW pet_project.mv_inactive_users_summary
|
||||
REFRESH every 1 day
|
||||
ENGINE SummingMergeTree()
|
||||
ORDER BY (user_id)
|
||||
AS
|
||||
SELECT u.user_id AS user_id,
|
||||
any(u.name) AS user_name,
|
||||
any(u.email) AS email,
|
||||
any(u.age) AS age,
|
||||
count() course_count,
|
||||
any(u.registration_date) AS registration_date
|
||||
FROM pet_project.users u
|
||||
LEFT JOIN pet_project.enrollments e USING (user_id)
|
||||
GROUP BY u.user_id;
|
||||
-- проверка
|
||||
SELECT * FROM pet_project.mv_inactive_users_summary;
|
||||
|
||||
|
||||
|
||||
49
queries/lesson_popularity_summary.sql
Normal file
49
queries/lesson_popularity_summary.sql
Normal file
@@ -0,0 +1,49 @@
|
||||
-- ### ✅ **Задание 2: Подготовь структуру витрины `lesson_popularity_summary`**
|
||||
--
|
||||
-- **Цель:** анализировать популярность каждого урока.
|
||||
--
|
||||
-- 📌 **Что нужно сделать:**
|
||||
--
|
||||
-- - Спроектируй таблицу, где каждая строка — один урок.
|
||||
-- - Для каждого урока должны храниться:
|
||||
-- - ID и название урока
|
||||
-- - ID и название курса, к которому он относится
|
||||
-- - Общее число просмотров
|
||||
-- - Количество уникальных пользователей, посмотревших урок
|
||||
-- - Дата первого и последнего просмотра
|
||||
--
|
||||
-- **Зачем это нужно:**
|
||||
--
|
||||
-- Эта витрина поможет выявлять наиболее популярные уроки и курсы, следить за актуальностью контента, понимать вовлечённость студентов по отдельным материалам.
|
||||
SELECT l.lesson_id AS lesson_id,
|
||||
l.title AS lesson_name,
|
||||
c.course_id AS course_id,
|
||||
c.title AS course_name,
|
||||
countOrNull() AS total_view,
|
||||
uniqOrNull(flv.user_id) AS unique_users,
|
||||
min(flv.viewed_at) AS first_date,
|
||||
max(flv.viewed_at) AS last_date
|
||||
FROM pet_project.lessons l
|
||||
LEFT JOIN pet_project.courses c ON c.course_id = l.course_id
|
||||
LEFT JOIN pet_project.fact_lesson_views flv ON flv.lesson_id = l.lesson_id
|
||||
GROUP BY l.lesson_id, l.title, c.course_id, c.title;
|
||||
|
||||
-- Создание мат view
|
||||
CREATE MATERIALIZED VIEW pet_project.mv_lesson_popularity_summary
|
||||
ENGINE = SummingMergeTree()
|
||||
ORDER BY (lesson_id, course_id)
|
||||
POPULATE
|
||||
AS
|
||||
SELECT l.lesson_id AS lesson_id,
|
||||
any(l.title) AS lesson_name,
|
||||
c.course_id AS course_id,
|
||||
any(c.title) AS course_name,
|
||||
count() AS total_views,
|
||||
uniq(flv.user_id) AS unique_users,
|
||||
min(flv.viewed_at) AS first_date,
|
||||
max(flv.viewed_at) AS last_date
|
||||
FROM pet_project.lessons l
|
||||
LEFT JOIN pet_project.courses c ON c.course_id = l.course_id
|
||||
LEFT JOIN pet_project.fact_lesson_views flv ON flv.lesson_id = l.lesson_id
|
||||
GROUP BY l.lesson_id, c.course_id;
|
||||
|
||||
Reference in New Issue
Block a user