--Активность пользователей 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;