Merge branch 'main' into OS-233
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE SKONEV.users(
|
||||
id INT PRIMARY KEY,
|
||||
name VARCHAR(100),
|
||||
age INT,
|
||||
email VARCHAR(255) UNIQUE,
|
||||
registration_date DATE NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE SKONEV.courses(
|
||||
id INT PRIMARY KEY,
|
||||
title TEXT NOT NULL,
|
||||
category VARCHAR(255) CHECK (category IN ('data', 'programming', 'business')),
|
||||
created_at DATE NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE SKONEV.lessons(
|
||||
id INT PRIMARY KEY,
|
||||
course_id INT NOT NULL,
|
||||
FOREIGN KEY (course_id) REFERENCES courses(id),
|
||||
title TEXT NOT NULL,
|
||||
duration_min INT NOT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE SKONEV.enrollments(
|
||||
id INT PRIMARY KEY,
|
||||
user_id INT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
course_id INT NOT NULL,
|
||||
FOREIGN KEY (course_id) REFERENCES courses(id),
|
||||
enrolled_at DATE NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE SKONEV.lesson_views(
|
||||
id INT PRIMARY KEY,
|
||||
user_id INT NOT NULL,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id),
|
||||
lesson_id INT NOT NULL,
|
||||
FOREIGN KEY (lesson_id) REFERENCES lessons(id),
|
||||
viewed_at TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,47 @@
|
||||
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;
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
BEGIN;
|
||||
|
||||
CREATE MATERIALIZED VIEW platform_summary AS
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM users) AS total_users,
|
||||
(SELECT COUNT(*) FROM courses) AS total_courses,
|
||||
(SELECT COUNT(*) FROM lessons) AS total_lessons,
|
||||
(SELECT COUNT(DISTINCT user_id) FROM lesson_views) AS users_with_views,
|
||||
ROUND(
|
||||
(SELECT COUNT(*)::DECIMAL FROM lessons) /
|
||||
NULLIF((SELECT COUNT(DISTINCT course_id) FROM lessons), 0),
|
||||
2
|
||||
) AS avg_lessons_per_course,
|
||||
ROUND(
|
||||
(SELECT COUNT(*)::DECIMAL FROM lesson_views) /
|
||||
NULLIF((SELECT COUNT(DISTINCT lesson_id) FROM lesson_views), 0),
|
||||
2
|
||||
) AS avg_views_per_lesson;
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,38 @@
|
||||
BEGIN;
|
||||
|
||||
CREATE MATERIALIZED VIEW user_activity_summary AS
|
||||
WITH users_views AS (
|
||||
SELECT
|
||||
u.id AS user_id,
|
||||
u.name,
|
||||
COUNT(DISTINCT lv.lesson_id) AS viewed_lessons_count,
|
||||
MAX(lv.viewed_at) AS last_view,
|
||||
MIN(lv.viewed_at) AS first_view
|
||||
FROM users AS u
|
||||
JOIN lesson_views AS lv on u.id = lv.user_id
|
||||
GROUP BY u.id
|
||||
|
||||
),
|
||||
users_engagement AS (
|
||||
SELECT
|
||||
e.user_id AS user_id,
|
||||
COUNT(DISTINCT l.id) AS lessons_cnt,
|
||||
COUNT(DISTINCT course_id) AS enrollment_count
|
||||
FROM enrollments AS e
|
||||
JOIN lessons AS l using(course_id)
|
||||
GROUP BY e.user_id
|
||||
)
|
||||
|
||||
SELECT
|
||||
uv.user_id,
|
||||
uv.name,
|
||||
ue.enrollment_count,
|
||||
uv.viewed_lessons_count,
|
||||
uv.last_view,
|
||||
uv.first_view,
|
||||
ROUND(uv.viewed_lessons_count::DECIMAL / NULLIF(ue.lessons_cnt, 0) * 100, 2) AS engagement_rate
|
||||
FROM users_views AS uv
|
||||
LEFT JOIN users_engagement AS ue using (user_id)
|
||||
ORDER BY uv.user_id
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,42 @@
|
||||
BEGIN;
|
||||
|
||||
INSERT INTO SKONEV.users (id, name, age, email, registration_date)
|
||||
VALUES
|
||||
(1, 'Alice', 25, 'alice@mail.com', '2023-01-10'),
|
||||
(2, 'Bob', 30, 'bob@gmail.com', '2023-02-05'),
|
||||
(3, 'Charlie', 22, 'charlie@mail.com', '2023-02-20'),
|
||||
(4, 'Diana', 28, 'diana@mail.com', '2023-03-01'),
|
||||
(5, 'Ethan', 35, 'ethan@gmail.com', '2023-03-10');
|
||||
|
||||
INSERT INTO SKONEV.courses (id, title, category, created_at)
|
||||
VALUES
|
||||
(1, 'SQL для начинающих', 'data', '2023-01-01'),
|
||||
(2, 'Python для анализа данных', 'programming', '2023-01-15'),
|
||||
(3, 'BI с нуля', 'business', '2023-03-01');
|
||||
|
||||
INSERT INTO SKONEV.lessons (id, course_id, title, duration_min)
|
||||
VALUES
|
||||
(1, 1, 'SELECT и FROM', 10),
|
||||
(2, 1, 'JOIN', 15),
|
||||
(3, 2, 'Pandas', 20),
|
||||
(4, 3, 'Основы BI', 12),
|
||||
(5, 3, 'Метрики и дашборды', 18);
|
||||
|
||||
INSERT INTO SKONEV.enrollments (id, user_id, course_id, enrolled_at)
|
||||
VALUES
|
||||
(1, 1, 1, '2023-01-15'),
|
||||
(2, 1, 2, '2023-02-01'),
|
||||
(3, 2, 1, '2023-01-20'),
|
||||
(4, 3, 2, '2023-03-05'),
|
||||
(5, 4, 3, '2023-04-01');
|
||||
|
||||
INSERT INTO SKONEV.lesson_views (id, user_id, lesson_id, viewed_at)
|
||||
VALUES
|
||||
(1, 1, 1, '2023-01-16 10:00:00'),
|
||||
(2, 1, 2, '2023-01-16 10:15:00'),
|
||||
(3, 2, 1, '2023-01-21 09:00:00'),
|
||||
(4, 3, 3, '2023-03-06 12:00:00'),
|
||||
(5, 4, 4, '2023-04-02 10:00:00'),
|
||||
(6, 4, 5, '2023-04-03 10:00:00');
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user