Files
homework/dmedvedev/11.5 Pet project Lesson_popularity_ranking.sql
T

64 lines
1.7 KiB
SQL

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;