From e8ad05df8bf0d621331cd7df614ff27f7784a9ec Mon Sep 17 00:00:00 2001 From: Dmitry Medvedev Date: Thu, 18 Jun 2026 15:04:51 +0500 Subject: [PATCH] added Mat VIEW Activity users for pet project --- dmedvedev/11.1 Pet project Activity users.sql | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 dmedvedev/11.1 Pet project Activity users.sql diff --git a/dmedvedev/11.1 Pet project Activity users.sql b/dmedvedev/11.1 Pet project Activity users.sql new file mode 100644 index 0000000..150c80d --- /dev/null +++ b/dmedvedev/11.1 Pet project Activity users.sql @@ -0,0 +1,63 @@ +--Активность пользователей + +CREATE MATERIALIZED VIEW user_activity_summary AS + +--CTE кол-во курсов на которые записан пользователь +WITH enrollment_count AS ( + SELECT + pe.user_id, + COUNT(*) AS enrollment_count + FROM pet_enrollments pe + GROUP BY pe.user_id +), +--CTE просмотренные уникальные уроки пользователем (кол-во) +viewed_lessons_count AS ( + SELECT + plv.user_id, + DENSE_RANK() OVER( + PARTITION BY plv.user_id + ORDER BY plv.lesson_id + ) AS viewed_lessons_count + FROM pet_lesson_views plv +), + +--CTE дата и время последнего просмотра урока +last_view AS ( + SELECT + plv.user_id, + LAST_VALUE(plv.viewed_at) OVER ( + PARTITION BY plv.user_id + ORDER BY plv.viewed_at + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS last_view + FROM pet_lesson_views plv +), + +--CTE дата и время первого просмотра урока +first_view AS ( + SELECT + plv.user_id, + FIRST_VALUE(plv.viewed_at) OVER ( + PARTITION BY plv.user_id + ORDER BY plv.viewed_at + ) AS first_view + FROM pet_lesson_views plv +) + +SELECT + pu.id AS user_id, + pu.name AS name, + ec.enrollment_count AS enrollment_count, + MAX(vlc.viewed_lessons_count) AS viewed_lessons_count, + last_view, + first_view, + ROUND(MAX(vlc.viewed_lessons_count * 100.0 / (SELECT COUNT(*) FROM pet_lessons pl)), 2) || '%' AS engagement_rate + +FROM pet_users pu +LEFT JOIN enrollment_count ec ON pu.id = ec.user_id +LEFT JOIN viewed_lessons_count vlc ON pu.id = vlc.user_id +LEFT JOIN last_view lv ON pu.id = lv.user_id +LEFT JOIN first_view fv ON pu.id = fv.user_id + +GROUP BY pu.id, ec.enrollment_count, last_view, first_view +ORDER BY pu.id; \ No newline at end of file