60 lines
3.0 KiB
SQL
60 lines
3.0 KiB
SQL
-- ### ✅ **Задание 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
|
|
;
|