From ebe1f007160a424ca17c4f10c7bf2d45019a22d0 Mon Sep 17 00:00:00 2001 From: Azamat Date: Sun, 11 Jan 2026 18:47:48 +0600 Subject: [PATCH] Full pet-project --- amaksatov/postgresql/OS-330.sql | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/amaksatov/postgresql/OS-330.sql b/amaksatov/postgresql/OS-330.sql index 4745707..9b78b52 100644 --- a/amaksatov/postgresql/OS-330.sql +++ b/amaksatov/postgresql/OS-330.sql @@ -14,3 +14,55 @@ LEFT JOIN lesson_views lv ON lv.user_id = e.user_id -- связь lessons с les JOIN lessons l ON l.course_id = e.course_id -- связь уроков с курсами пользователя GROUP BY u.id, u.name -- группировка по user_id и name ORDER BY user_id; -- сортировка по user_id + + +CREATE MATERIALIZED VIEW course_summary AS +SELECT + c.id AS course_id, + c.title AS course_title, + COUNT(DISTINCT e.user_id) AS unique_users, + COUNT(DISTINCT l.id) AS lessons_count, + COUNT(DISTINCT lv.id) AS total_views, + ROUND( + CASE + WHEN COUNT(DISTINCT e.user_id) = 0 THEN NULL + ELSE COUNT(DISTINCT lv.id) * 1.0 / COUNT(DISTINCT e.user_id) + END, 2) AS avg_views_per_user, + MIN(lv.viewed_at) AS first_viewed_at, + MAX(lv.viewed_at) AS last_viewed_at +FROM courses c +LEFT JOIN enrollments e ON e.course_id = c.id +LEFT JOIN lessons l ON c.id = l.course_id +LEFT JOIN lesson_views lv ON lv.lesson_id = l.id +GROUP BY c.id; + + + + + +CREATE MATERIALIZED VIEW platform_summary AS +WITH +user_stats AS ( + SELECT COUNT(*) AS total_users FROM users +), +course_stats AS ( + SELECT COUNT(*) AS total_courses FROM courses +), +lesson_stats AS ( + SELECT COUNT(*) AS total_lessons FROM lessons +), +view_stats AS ( + SELECT COUNT(*) AS total_views, COUNT(DISTINCT user_id) AS users_with_views + FROM lesson_views +) + +SELECT + u.total_users, + c.total_courses, + l.total_lessons, + v.users_with_views, + + ROUND(l.total_lessons::decimal / NULLIF(c.total_courses, 0), 2) AS avg_lessons_per_course, + ROUND(v.total_views::decimal / NULLIF(l.total_lessons, 0), 2) AS avg_views_per_lesson + +FROM user_stats u, course_stats c, lesson_stats l, view_stats v;