Пет-проект Greenplum (полностью)

This commit is contained in:
Bonifatsiy
2026-01-23 00:12:06 +04:00
parent ac9a2e0906
commit 93b3777a42
3 changed files with 105 additions and 0 deletions
+105
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB