added second part of pet project 'effective courses'

This commit is contained in:
Dmitry Medvedev
2026-06-19 15:06:53 +05:00
parent e8ad05df8b
commit 0613f3ee31
@@ -0,0 +1,83 @@
CREATE MATERIALIZED VIEW course_summary AS
--кол-во уникальных пользователей в рамках одного курса (ready)
WITH unique_users AS (
SELECT
pe.course_id,
COUNT(*) AS unique_users
FROM pet_enrollments pe
GROUP BY pe.course_id
ORDER BY pe.course_id
),
--общее кол-во уроков
lesson_count AS (
SELECT
pl.course_id,
COUNT(*) AS lesson_count
FROM pet_lessons pl
GROUP BY pl.course_id
ORDER BY pl.course_id
),
--суммарное число просмотров уроков по курсу
total_views AS (
SELECT
pc.id,
COUNT(*) AS total_views
FROM pet_courses pc
JOIN pet_lessons pl ON pc.id = pl.course_id
JOIN pet_lesson_views plv ON pl.id = plv.lesson_id
GROUP BY pc.id
ORDER BY pc.id
),
--дата и время первого просмотра любого урока курса
first_viewed_at AS (
SELECT
pc.id,
FIRST_VALUE(plv.viewed_at) OVER (
PARTITION BY pc.id
ORDER BY plv.viewed_at
) AS first_viewed_at
FROM pet_courses pc
JOIN pet_lessons pl ON pc.id = pl.course_id
JOIN pet_lesson_views plv ON pl.id = plv.lesson_id
),
--дата и время последнего просмотра любого урока курса
last_viewed_at AS (
SELECT
pc.id,
LAST_VALUE(plv.viewed_at) OVER (
PARTITION BY pc.id
ORDER BY plv.viewed_at
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS last_viewed_at
FROM pet_courses pc
JOIN pet_lessons pl ON pc.id = pl.course_id
JOIN pet_lesson_views plv ON pl.id = plv.lesson_id
)
SELECT
pc.id AS course_id,
pc.title AS course_title,
uu.unique_users,
lc.lesson_count,
tv.total_views,
ROUND(tv.total_views * 1.0 / uu.unique_users, 2) AS avg_views_per_user,
first_viewed_at,
last_viewed_at
FROM pet_courses pc
LEFT JOIN unique_users uu ON pc.id = uu.course_id
LEFT JOIN lesson_count lc ON lc.course_id = pc.id
LEFT JOIN total_views tv ON tv.id = pc.id
LEFT JOIN first_viewed_at fva ON fva.id = pc.id
LEFT JOIN last_viewed_at lva ON lva.id = pc.id
GROUP BY pc.id, uu.unique_users, lc.lesson_count, tv.total_views, first_viewed_at, last_viewed_at
ORDER BY course_id