diff --git a/dsolovianov/greenplum/Script-1.sql b/dsolovianov/greenplum/Script-1.sql new file mode 100644 index 0000000..bb78b2a --- /dev/null +++ b/dsolovianov/greenplum/Script-1.sql @@ -0,0 +1,105 @@ +--Витрина 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 \ No newline at end of file diff --git a/dsolovianov/greenplum/dm.course_completion_rate.png b/dsolovianov/greenplum/dm.course_completion_rate.png new file mode 100644 index 0000000..142dbef Binary files /dev/null and b/dsolovianov/greenplum/dm.course_completion_rate.png differ diff --git a/dsolovianov/greenplum/dm.inactive_users_summary.png b/dsolovianov/greenplum/dm.inactive_users_summary.png new file mode 100644 index 0000000..a0e1aee Binary files /dev/null and b/dsolovianov/greenplum/dm.inactive_users_summary.png differ