-- ### ✅ **Задание 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 ;