Files
homework/skonev/postgresql/dm_course_summary.sql
T
2025-12-19 11:39:12 +03:00

48 lines
1019 B
PL/PgSQL

BEGIN;
CREATE MATERIALIZED VIEW course_summary AS
WITH courses_users AS (
SELECT
c.id AS course_id,
c.title AS course_name,
COUNT(DISTINCT user_id) AS unique_users
FROM courses c
LEFT join enrollments e ON c.id = e.course_id
GROUP BY c.id, c.title
),
courses_views AS (
SELECT
l.course_id,
COUNT(lv.id) AS total_views,
MAX(lv.viewed_at) AS last_viewed_at,
MIN(lv.viewed_at) AS first_viewed_at
FROM lessons l
JOIN lesson_views lv ON l.id = lv.lesson_id
GROUP BY l.course_id
),
courses_lessons AS (
SELECT
course_id,
COUNT(DISTINCT id) AS lessons_count
FROM lessons
GROUP BY course_id
)
SELECT
cu.course_id,
cu.course_name,
cu.unique_users,
cl.lessons_count,
cv.total_views,
ROUND(cv.total_views::DECIMAL / NULLIF(cu.unique_users, 0), 2) AS avg_views_per_user,
cv.first_viewed_at,
cv.last_viewed_at
FROM courses_users cu
LEFT JOIN courses_views cv USING(course_id)
LEFT JOIN courses_lessons cl USING(course_id)
ORDER BY cu.course_id;
COMMIT;