CREATE MATERIALIZED VIEW user_activity_summary AS SELECT u.id AS user_id, -- user_id u.name, -- name COUNT(DISTINCT e.course_id) AS enrollment_count, -- кол-во записей на курсы COUNT(DISTINCT lv.lesson_id) AS viewed_lessons_count, -- кол-во просмотренных уроков MAX(lv.viewed_at) AS last_viewed, -- последний просмотр MIN(lv.viewed_at) AS first_viewed, -- первый просмотр ROUND(COUNT(DISTINCT l.course_id) * 100.0 / COUNT(DISTINCT l.id), 2) || '%' AS engagement_rate -- вовлеченность(процент просмотренных/записанным) FROM amaksatov.users u -- основная таблица JOIN enrollments e ON e.user_id = u.id -- связь users с enrollments LEFT JOIN lesson_views lv ON lv.user_id = e.user_id -- связь lessons с lesson_views JOIN lessons l ON l.course_id = e.course_id -- связь уроков с курсами пользователя GROUP BY u.id, u.name -- группировка по user_id и name ORDER BY user_id; -- сортировка по user_id CREATE MATERIALIZED VIEW course_summary AS SELECT c.id AS course_id, c.title AS course_title, COUNT(DISTINCT e.user_id) AS unique_users, COUNT(DISTINCT l.id) AS lessons_count, COUNT(DISTINCT lv.id) AS total_views, ROUND( CASE WHEN COUNT(DISTINCT e.user_id) = 0 THEN NULL ELSE COUNT(DISTINCT lv.id) * 1.0 / COUNT(DISTINCT e.user_id) END, 2) AS avg_views_per_user, MIN(lv.viewed_at) AS first_viewed_at, MAX(lv.viewed_at) AS last_viewed_at FROM courses c LEFT JOIN enrollments e ON e.course_id = c.id LEFT JOIN lessons l ON c.id = l.course_id LEFT JOIN lesson_views lv ON lv.lesson_id = l.id GROUP BY c.id; CREATE MATERIALIZED VIEW platform_summary AS WITH user_stats AS ( SELECT COUNT(*) AS total_users FROM users ), course_stats AS ( SELECT COUNT(*) AS total_courses FROM courses ), lesson_stats AS ( SELECT COUNT(*) AS total_lessons FROM lessons ), view_stats AS ( SELECT COUNT(*) AS total_views, COUNT(DISTINCT user_id) AS users_with_views FROM lesson_views ) SELECT u.total_users, c.total_courses, l.total_lessons, v.users_with_views, ROUND(l.total_lessons::decimal / NULLIF(c.total_courses, 0), 2) AS avg_lessons_per_course, ROUND(v.total_views::decimal / NULLIF(l.total_lessons, 0), 2) AS avg_views_per_lesson FROM user_stats u, course_stats c, lesson_stats l, view_stats v;