105 lines
2.6 KiB
SQL
105 lines
2.6 KiB
SQL
--Витрина 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 |