added Mater VIEW for Pet Project 'lesson_popularity_ranking'

This commit is contained in:
Dmitry Medvedev
2026-06-22 01:45:15 +05:00
parent 8495b6a66e
commit 6b22a048fc
@@ -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;