Files
homework/bhabibullin/postgre/postrge_pet_project.sql
T

182 lines
5.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
create table users(
id int primary key,
name varchar(255),
age int,
email varchar(255),
registration_date date
);
insert into 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');
create table courses(
id int primary key,
title varchar(255),
category varchar(255),
created_at date
);
insert into 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');
create table lessons(
id int primary key,
course_id int,
title varchar(255),
duration_min int,
foreign key (course_id) references courses(id)
);
insert into 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);
create table enrollments(
id int primary key,
user_id int,
course_id int,
enrolled_at date,
foreign key (user_id) references users(id),
foreign key (course_id) references courses(id)
);
insert into 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');
create table lesson_views(
id int primary key,
user_id int,
lesson_id int,
viewed_at timestamp,
foreign key (user_id) references users(id),
foreign key (lesson_id) references lessons(id)
);
insert into 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');
create materialized view user_activity_summary as (
with available_lessons as (
select
e.user_id,
count(distinct l.id) as cnt_lesson
from lessons l
join enrollments e on e.course_id = l.course_id
group by e.user_id
)
select
u.id,
u.name,
count(distinct e.course_id) as enrrollment_count,
count(distinct lv.lesson_id) as viewed_lessons_count,
max(lv.viewed_at) as last_view,
min(lv.viewed_at) as first_view,
round(count(distinct lv.lesson_id) * 100.0 / NULLIF(al.cnt_lesson, 0), 4) as engagement_rate
from users u
join enrollments e on u.id = e.user_id
left join lesson_views lv on lv.user_id = u.id
join available_lessons al on al.user_id = u.id
group by u.id, u.name, al.cnt_lesson
);
/*
Витрина user_activity_summary
Цель - показать аналитику вовлеченности пользователей в обучение на платформе
user_id - идентификатор пользователя
name - имя пользователя
enrollment_count - количество записей на курсы
viewed_lessons_count - количество просмотренных уроков
last_view - последний просмотр
first_view - первый просмотр
engagement_rate - вовлеченность
*/
create materialized view course_summary as(
with view_cnt as (
select l.course_id,
count(lv.lesson_id) cnt
from lessons l
join lesson_views lv on l.id = lv.lesson_id
group by l.course_id
)
select
c.id as course_id,
c.title,
count(distinct e.user_id) unique_users,
count(distinct l.id) lessons_count,
vc.cnt total_views,
round(vc.cnt * 1.0 / count(distinct e.user_id), 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
join lessons l on c.id = l.course_id
join enrollments e on e.course_id = c.id
join view_cnt vc on vc.course_id = c.id
left join lesson_views lv on lv.lesson_id = l.id
group by c.title, vc.cnt, c.id
order by course_id
);
/*
Витрина course_summary
Цель - показать анализ эффективности по каждому курсу
course_id - идентификатор курса
course title - название курса
unique_users - кол-во уникальных пользователей в рамках одного курса
lessons_count - кол-во уроков
total_views - общее число просмотров уроков по курсу
avg_views_per_user - total_views / unique_users Среднее число просмотров на пользователя, записанного на курс
first_viewed_at - дата первого просмотра
last_viewed_at - дата последнего просмотра
*/
create materialized view platform_summary as (
select
count(distinct u.id) as total_users,
count(distinct c.id) as total_courses,
count(distinct l.id) as total_lessons,
count(distinct lv.user_id) as users_with_views,
round(count(distinct l.id) * 1.0 / NULLIF(count(distinct c.id), 0), 2) as avg_lessons_per_course,
count(lv.lesson_id) * 1.0 / NULLIF(count(distinct l.id), 0) as avg_lessons_per_lesson
from users u
left join lesson_views lv on lv.user_id = u.id
left join lessons l on l.id = lv.lesson_id
left join courses c on c.id = l.course_id
);
/*
Витрина platform_summary
Цель - показать общую отчетность по взаимодействию
total_users - всего пользователей
total_courses - всего курсов
total_lessons - всего уроков
users_with_views - сколько пользователей с минимум 1 просмотром
avg_lessons_per_course - среднее число уроков на курс
avg_views_per_lesson - среднее число просмотров на урок
*/