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