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;