Files
homework/dmezentsev/postgresql/pet_project/dm_course_summary.sql
T
2026-05-27 14:04:50 +03:00

46 lines
1.3 KiB
SQL

DROP MATERIALIZED VIEW IF EXISTS dmezentsev.course_summary;
CREATE MATERIALIZED VIEW dmezentsev.course_summary AS
WITH count_users AS (
-- Кол-во уникальных пользователей в курсах
SELECT
c.id AS course_id,
c.title AS course_title,
COUNT(DISTINCT e.user_id) AS unique_users
FROM dmezentsev.courses c
LEFT JOIN dmezentsev.enrollments e ON c.id = e.course_id
GROUP BY c.id, c.title
),
count_lessons AS (
-- Кол-во уроков в курсах
SELECT
course_id,
COUNT(id) AS lessons_count
FROM dmezentsev.lessons
GROUP BY course_id
),
views_count AS (
-- Суммарное число просмотров по каждому курсу
SELECT
l.course_id,
COUNT(lv.id) AS total_views,
MIN(lv.viewed_at) AS first_viewed_at,
MAX(lv.viewed_at) AS last_viewed_at
FROM dmezentsev.lessons l
LEFT JOIN dmezentsev.lesson_views lv ON l.id = lv.lesson_id
GROUP BY l.course_id
)
SELECT
cu.course_id,
cu.course_title,
cu.unique_users,
cl.lessons_count,
vc.total_views,
ROUND(COALESCE(vc.total_views::numeric /
cu.unique_users, 0), 2) AS avg_views_per_user,
vc.first_viewed_at,
vc.last_viewed_at
FROM count_users cu
LEFT JOIN count_lessons cl USING (course_id)
LEFT JOIN views_count vc USING (course_id)
ORDER BY cu.course_id;