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;