From 0613f3ee31dc200fd556d4b1b61c589b0048d982 Mon Sep 17 00:00:00 2001 From: Dmitry Medvedev Date: Fri, 19 Jun 2026 15:06:53 +0500 Subject: [PATCH] added second part of pet project 'effective courses' --- .../11.2 Pet project Effective courses.sql | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 dmedvedev/11.2 Pet project Effective courses.sql diff --git a/dmedvedev/11.2 Pet project Effective courses.sql b/dmedvedev/11.2 Pet project Effective courses.sql new file mode 100644 index 0000000..1d8b00f --- /dev/null +++ b/dmedvedev/11.2 Pet project Effective courses.sql @@ -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 +