64 lines
1.7 KiB
SQL
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;
|
|
|