diff --git a/aharlamcev/postgresql/Pet-projectsql.sql b/aharlamcev/postgresql/Pet-projectsql.sql index 1fb75f6..4bf94af 100644 --- a/aharlamcev/postgresql/Pet-projectsql.sql +++ b/aharlamcev/postgresql/Pet-projectsql.sql @@ -322,5 +322,40 @@ avg_time_to_first_view from CTE ; +------------------------------------------------------------------------------------------------------------------ +-- 5 Задание Популярность курсов +create materialized view lesson_popularity_ranking AS +with lessons_in_courses as ( + select l.id as lesson_id, l.title as lesson_title, c.title as course_title, + COUNT(e.user_id) as enrolled_users + from lessons l + join courses c on l.course_id = c.id + join enrollments e on e.course_id = c.id + group by l.id, l.title, c.title + order by lesson_id + ), +views_cte as ( + select lic.lesson_id, + COUNT(lv.id) as total_views, + COUNT(distinct lv.user_id) as unique_viewers, + 1.00 * COUNT(lv.id) / COUNT(distinct lv.user_id) as avg_views_per_user, + COUNT(lic.enrolled_users) as enrolled_to_course + from lessons_in_courses lic + join lesson_views lv on lic.lesson_id = lv.lesson_id + group by lic.lesson_id + ) +select lic.lesson_id, lic.lesson_title, lic.course_title, +vc.total_views, +vc.unique_viewers, +vc.avg_views_per_user, +dense_rank() OVER (ORDER BY vc.total_views desc) as popularity_rank, +ROUND(100.0 * unique_viewers / enrolled_to_course, 2) as completion_rate  +from lessons_in_courses lic +join views_cte vc on lic.lesson_id = vc.lesson_id +; +-- Единственный момент в том, что в итоговом MV нет уроков и курсов без просмотров, +--то есть тут только те уроки, у которых есть хотя бы 1 просмотр. +-- Я не смог разобраться с NULL после LEFT JOIN таблиц и выдывало ошибку деления на 0 при подсчете completion_rate +