From a109cadca200fe5e9bed81672bcb0bb57a83816a Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 23 Feb 2026 13:22:24 +0300 Subject: [PATCH] Added LEFT JOIN and NULLIF to Task 5 --- aharlamcev/postgresql/Pet-projectsql.sql | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/aharlamcev/postgresql/Pet-projectsql.sql b/aharlamcev/postgresql/Pet-projectsql.sql index 4bf94af..a7cee09 100644 --- a/aharlamcev/postgresql/Pet-projectsql.sql +++ b/aharlamcev/postgresql/Pet-projectsql.sql @@ -324,7 +324,7 @@ from CTE ------------------------------------------------------------------------------------------------------------------ -- 5 Задание Популярность курсов -create materialized view lesson_popularity_ranking AS +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 @@ -338,24 +338,22 @@ 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, + 1.00 * COUNT(lv.id) / nullif(COUNT(distinct lv.user_id), 0) 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 + left 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, +coalesce(vc.avg_views_per_user, 0), dense_rank() OVER (ORDER BY vc.total_views desc) as popularity_rank, -ROUND(100.0 * unique_viewers / enrolled_to_course, 2) as completion_rate  +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 +