From 6b22a048fc1726d8516b68cdd54853c32b4725d7 Mon Sep 17 00:00:00 2001 From: Dmitry Medvedev Date: Mon, 22 Jun 2026 01:45:15 +0500 Subject: [PATCH] added Mater VIEW for Pet Project 'lesson_popularity_ranking' --- ... Pet project Lesson_popularity_ranking.sql | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 dmedvedev/11.5 Pet project Lesson_popularity_ranking.sql diff --git a/dmedvedev/11.5 Pet project Lesson_popularity_ranking.sql b/dmedvedev/11.5 Pet project Lesson_popularity_ranking.sql new file mode 100644 index 0000000..a2bb0da --- /dev/null +++ b/dmedvedev/11.5 Pet project Lesson_popularity_ranking.sql @@ -0,0 +1,64 @@ +CREATE MATERIALIZED VIEW lesson_popularity_ranking AS + +SELECT + pl.id AS lesson_id, + pl.title AS lesson_title, + pc.id AS course_id, + pc.title AS course_title, + total_views_lesson.total_views AS total_views, + table_unique_viewers.unique_v AS unique_viewers, + ROUND(AVG(views_one_user_per_one_lesson.views_per_viewer), 2) AS avg_views_per_viewer, --также это можно было посчитать total_views/unique_viewers + DENSE_RANK() OVER ( + ORDER BY total_views_lesson.total_views DESC NULLS LAST + ) AS popularity_rank, + + ROUND(table_unique_viewers.unique_v * 100.0 / table_enrolled_users.enrolled_to_course, 2) || '%' AS completion_rate + + FROM pet_lessons pl + + LEFT JOIN ( + SELECT + lesson_id, + COUNT(*) AS total_views + FROM pet_lesson_views + GROUP BY lesson_id + ) AS total_views_lesson + ON total_views_lesson.lesson_id = pl.id + + LEFT JOIN pet_courses pc + ON pc.id = pl.course_id + + LEFT JOIN ( + SELECT + lesson_id, + COUNT(DISTINCT user_id) AS unique_v + FROM pet_lesson_views plv + GROUP BY plv.lesson_id + ) AS table_unique_viewers + ON table_unique_viewers.lesson_id = pl.id + + LEFT JOIN ( + SELECT + lesson_id, + user_id, + COUNT(*) AS views_per_viewer + FROM pet_lesson_views plv + GROUP BY user_id, lesson_id + ORDER BY user_id, lesson_id + ) AS views_one_user_per_one_lesson + ON views_one_user_per_one_lesson.lesson_id = pl.id + + LEFT JOIN ( + SELECT + course_id, + COUNT(DISTINCT user_id) AS enrolled_to_course + FROM pet_enrollments pe + GROUP BY course_id + ) AS table_enrolled_users + ON table_enrolled_users.course_id = pc.id + + + + GROUP BY pl.id, pl.title, pc.id, pc.title, total_views_lesson.total_views, table_unique_viewers.unique_v, table_enrolled_users.enrolled_to_course + ORDER BY lesson_id; + \ No newline at end of file