DROP MATERIALIZED VIEW IF EXISTS dm.course_completion_rate; CREATE MATERIALIZED VIEW dm.course_completion_rate DISTRIBUTED BY (user_id) AS with activity_users as ( select e.user_id as user_id, e.course_id as course_id, COUNT(flv.viewed_at) as lessons_viewed from core.enrollments e left join core.dim_lesson dl on e.course_id = dl.course_id left join core.fact_lesson_views flv on e.user_id = flv.user_id and e.course_id = flv.course_id and dl.lesson_id = flv.lesson_id group by e.user_id, e.course_id), course2 as ( select course_id, COUNT(*) as lessons_in_course from core.dim_lesson group by course_id) select au.user_id as user_id, du."name" as user_name, au.course_id as course_id, dc.title as course_title, c2.lessons_in_course as lessons_in_course, au.lessons_viewed as lessons_viewed, ROUND(au.lessons_viewed * 1.0 / c2.lessons_in_course , 2) as completion_rate from activity_users au left join core.dim_user du on au.user_id = du.user_id left join core.dim_course dc on au.course_id = dc.course_id left join course2 c2 on au.course_id = c2.course_id order by au.user_id, au.course_id;