--Витрина dm.lesson_popularity_summary CREATE MATERIALIZED VIEW dm.lesson_popularity_summary as select l.lesson_id, l.title as lesson_title, c.course_id, c.title as course_title, COUNT(f.user_id) as total_views, COUNT(DISTINCT f.user_id) as unique_users, MIN(f.viewed_at) as first_view, MAX(f.viewed_at) as last_view FROM core.fact_lesson_views f JOIN core.dim_lesson l ON f.lesson_id = l.lesson_id JOIN core.dim_course c ON l.course_id = c.course_id GROUP BY l.lesson_id, l.title, c.course_id, c.title order by lesson_id; select * from dm.lesson_popularity_summary; --Удалил лишний индекс DROP INDEX core.idx_fact_views_course_id; -- Все индексы для CORE-таблиц SELECT tablename, indexname, indexdef FROM pg_indexes WHERE schemaname = 'core' AND tablename IN ( 'dim_course', 'dim_date', 'dim_lesson', 'dim_user', 'enrollments', 'fact_lesson_views' ) ORDER by indexname, tablename; --Витрина dm.inactive_users_summary CREATE MATERIALIZED VIEW dm.inactive_users_summary as select du.user_id, du.name as user_name, du.email, du.age, COUNT(e.course_id) as enrollments_count, du.registration_date from core.dim_user du left join core.enrollments e on du.user_id = e.user_id left join core.fact_lesson_views flv on du.user_id = flv.user_id where flv.user_id is NULL group by du.user_id, du.name, du.email, du.age, du.registration_date order by du.user_id; select * from dm.inactive_users_summary; --Витрина dm.course_completion_rate CREATE MATERIALIZED VIEW dm.course_completion_rate as select du.user_id, du.name as user_name, dc.course_id, dc.title as course_title, COUNT(DISTINCT dl.lesson_id) AS lessons_in_course, COUNT(DISTINCT flv.lesson_id) AS lessons_viewed, ROUND(COUNT(DISTINCT flv.lesson_id)::numeric / NULLIF(COUNT(DISTINCT dl.lesson_id), 0), 2) AS completion_rate from core.enrollments e left join core.dim_user du on du.user_id = e.user_id left join core.dim_course dc on dc.course_id = e.course_id left join core.dim_lesson dl on dl.course_id = e.course_id left join core.fact_lesson_views flv on flv.user_id = e.user_id and flv.lesson_id = dl.lesson_id group by du.user_id, du.name, dc.course_id, dc.title order by du.user_id; select * from dm.course_completion_rate order by user_id; --Этап 5. Проверка SELECT * FROM dm.lesson_popularity_summary LIMIT 10; SELECT * FROM dm.inactive_users_summary LIMIT 10; SELECT * FROM dm.course_completion_rate LIMIT 10; --Все витрины отображаются корректно. Скрины: "название витрины".png