Merge branch 'sql_homework' of https://gitea.de-infra.servehttp.com/de-infrastructure/DWH into sql_homework
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 175 KiB |
@@ -0,0 +1,72 @@
|
|||||||
|
--Задача 1: Создай таблицу page_views
|
||||||
|
|
||||||
|
CREATE TABLE page_views (
|
||||||
|
user_id UInt64,
|
||||||
|
url String,
|
||||||
|
view_time DateTime
|
||||||
|
)
|
||||||
|
ENGINE = MergeTree()
|
||||||
|
PARTITION BY toYYYYMM(view_time)
|
||||||
|
ORDER BY (user_id, view_time);
|
||||||
|
|
||||||
|
--Задача 2: Создай таблицу users
|
||||||
|
|
||||||
|
CREATE TABLE users (
|
||||||
|
id UInt64,
|
||||||
|
name String,
|
||||||
|
updated_at DateTime
|
||||||
|
)
|
||||||
|
ENGINE = ReplacingMergeTree(updated_at)
|
||||||
|
ORDER BY id;
|
||||||
|
|
||||||
|
-- Задача 3: Создай таблицу region_sales
|
||||||
|
|
||||||
|
CREATE TABLE region_sales (
|
||||||
|
region String,
|
||||||
|
date Date,
|
||||||
|
sales UInt64
|
||||||
|
)
|
||||||
|
ENGINE = SummingMergeTree()
|
||||||
|
PARTITION BY toYYYYMM(date)
|
||||||
|
ORDER BY (region, date);
|
||||||
|
|
||||||
|
--Задача 4.1: Создай таблицу user_metrics
|
||||||
|
|
||||||
|
CREATE TABLE user_metrics (
|
||||||
|
region String,
|
||||||
|
avg_age_state AggregateFunction(avg, UInt8),
|
||||||
|
active_users_state AggregateFunction(uniq, UInt64)
|
||||||
|
)
|
||||||
|
ENGINE = AggregatingMergeTree()
|
||||||
|
ORDER BY region;
|
||||||
|
|
||||||
|
--Задача 4.3: - Вставь данные и Читай их через `avgMerge()` и `uniqMerge()`
|
||||||
|
|
||||||
|
INSERT INTO user_metrics
|
||||||
|
SELECT
|
||||||
|
region,
|
||||||
|
avgState(age) AS avg_age_state,
|
||||||
|
uniqState(toUInt64(user_id)) AS active_users_state
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT 'Samara' AS region, 25 AS age, 1 AS user_id
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'Moscow', 30, 2
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'Moscow', 22, 3
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'Samara', 22, 4
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'Sochi', 34, 5
|
||||||
|
)
|
||||||
|
GROUP BY region;
|
||||||
|
|
||||||
|
--Задача 4.4: - Читай их через `avgMerge()` и `uniqMerge()`
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
region,
|
||||||
|
avgMerge(avg_age_state),
|
||||||
|
uniqMerge(active_users_state)
|
||||||
|
FROM user_metrics
|
||||||
|
GROUP BY region;
|
||||||
|
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
--Витрина dm.lesson_popularity_summary
|
||||||
|
CREATE MATERIALIZED VIEW dm.lesson_popularity_summary as
|
||||||
|
select
|
||||||
|
l.lesson_id,
|
||||||
|
l.title as lesson_title,
|
||||||
|
c.course_id,
|
||||||
|
c.title as course_title,
|
||||||
|
COUNT(f.user_id) as total_views,
|
||||||
|
COUNT(DISTINCT f.user_id) as unique_users,
|
||||||
|
MIN(f.viewed_at) as first_view,
|
||||||
|
MAX(f.viewed_at) as last_view
|
||||||
|
FROM core.fact_lesson_views f
|
||||||
|
JOIN core.dim_lesson l
|
||||||
|
ON f.lesson_id = l.lesson_id
|
||||||
|
JOIN core.dim_course c
|
||||||
|
ON l.course_id = c.course_id
|
||||||
|
GROUP BY
|
||||||
|
l.lesson_id,
|
||||||
|
l.title,
|
||||||
|
c.course_id,
|
||||||
|
c.title
|
||||||
|
order by lesson_id;
|
||||||
|
|
||||||
|
select * from dm.lesson_popularity_summary;
|
||||||
|
|
||||||
|
--Удалил лишний индекс
|
||||||
|
DROP INDEX core.idx_fact_views_course_id;
|
||||||
|
|
||||||
|
-- Все индексы для CORE-таблиц
|
||||||
|
SELECT
|
||||||
|
tablename,
|
||||||
|
indexname,
|
||||||
|
indexdef
|
||||||
|
FROM pg_indexes
|
||||||
|
WHERE schemaname = 'core'
|
||||||
|
AND tablename IN (
|
||||||
|
'dim_course',
|
||||||
|
'dim_date',
|
||||||
|
'dim_lesson',
|
||||||
|
'dim_user',
|
||||||
|
'enrollments',
|
||||||
|
'fact_lesson_views'
|
||||||
|
)
|
||||||
|
ORDER by indexname, tablename;
|
||||||
|
|
||||||
|
|
||||||
|
--Витрина dm.inactive_users_summary
|
||||||
|
CREATE MATERIALIZED VIEW dm.inactive_users_summary as
|
||||||
|
select
|
||||||
|
du.user_id,
|
||||||
|
du.name as user_name,
|
||||||
|
du.email,
|
||||||
|
du.age,
|
||||||
|
COUNT(e.course_id) as enrollments_count,
|
||||||
|
du.registration_date
|
||||||
|
from core.dim_user du
|
||||||
|
left join core.enrollments e
|
||||||
|
on du.user_id = e.user_id
|
||||||
|
left join core.fact_lesson_views flv
|
||||||
|
on du.user_id = flv.user_id
|
||||||
|
where flv.user_id is NULL
|
||||||
|
group by
|
||||||
|
du.user_id,
|
||||||
|
du.name,
|
||||||
|
du.email,
|
||||||
|
du.age,
|
||||||
|
du.registration_date
|
||||||
|
order by du.user_id;
|
||||||
|
|
||||||
|
select * from dm.inactive_users_summary;
|
||||||
|
|
||||||
|
--Витрина dm.course_completion_rate
|
||||||
|
CREATE MATERIALIZED VIEW dm.course_completion_rate as
|
||||||
|
select
|
||||||
|
du.user_id,
|
||||||
|
du.name as user_name,
|
||||||
|
dc.course_id,
|
||||||
|
dc.title as course_title,
|
||||||
|
COUNT(DISTINCT dl.lesson_id) AS lessons_in_course,
|
||||||
|
COUNT(DISTINCT flv.lesson_id) AS lessons_viewed,
|
||||||
|
ROUND(COUNT(DISTINCT flv.lesson_id)::numeric / NULLIF(COUNT(DISTINCT dl.lesson_id), 0), 2) AS completion_rate
|
||||||
|
from core.enrollments e
|
||||||
|
left join core.dim_user du
|
||||||
|
on du.user_id = e.user_id
|
||||||
|
left join core.dim_course dc
|
||||||
|
on dc.course_id = e.course_id
|
||||||
|
left join core.dim_lesson dl
|
||||||
|
on dl.course_id = e.course_id
|
||||||
|
left join core.fact_lesson_views flv
|
||||||
|
on flv.user_id = e.user_id
|
||||||
|
and flv.lesson_id = dl.lesson_id
|
||||||
|
group by
|
||||||
|
du.user_id,
|
||||||
|
du.name,
|
||||||
|
dc.course_id,
|
||||||
|
dc.title
|
||||||
|
order by du.user_id;
|
||||||
|
|
||||||
|
select * from dm.course_completion_rate order by user_id;
|
||||||
|
|
||||||
|
--Этап 5. Проверка
|
||||||
|
SELECT * FROM dm.lesson_popularity_summary LIMIT 10;
|
||||||
|
SELECT * FROM dm.inactive_users_summary LIMIT 10;
|
||||||
|
SELECT * FROM dm.course_completion_rate LIMIT 10;
|
||||||
|
--Все витрины отображаются корректно. Скрины: "название витрины".png
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 104 KiB |
@@ -0,0 +1,508 @@
|
|||||||
|
--
|
||||||
|
-- PostgreSQL database dump
|
||||||
|
--
|
||||||
|
|
||||||
|
-- Dumped from database version 9.4.26
|
||||||
|
-- Dumped by pg_dump version 17.5
|
||||||
|
|
||||||
|
-- Started on 2026-01-17 22:42:00
|
||||||
|
|
||||||
|
SET statement_timeout = 0;
|
||||||
|
SET lock_timeout = 0;
|
||||||
|
SET idle_in_transaction_session_timeout = 0;
|
||||||
|
SET transaction_timeout = 0;
|
||||||
|
SET client_encoding = 'UTF8';
|
||||||
|
SET standard_conforming_strings = on;
|
||||||
|
SELECT pg_catalog.set_config('search_path', '', false);
|
||||||
|
SET check_function_bodies = false;
|
||||||
|
SET xmloption = content;
|
||||||
|
SET client_min_messages = warning;
|
||||||
|
SET row_security = off;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 10 (class 2615 OID 25610)
|
||||||
|
-- Name: core; Type: SCHEMA; Schema: -; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE SCHEMA core;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER SCHEMA core OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 11 (class 2615 OID 25611)
|
||||||
|
-- Name: dm; Type: SCHEMA; Schema: -; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE SCHEMA dm;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER SCHEMA dm OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 9 (class 2615 OID 25609)
|
||||||
|
-- Name: raw; Type: SCHEMA; Schema: -; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE SCHEMA raw;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER SCHEMA raw OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
SET default_tablespace = '';
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 273 (class 1259 OID 25635)
|
||||||
|
-- Name: dim_course; Type: TABLE; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_course (
|
||||||
|
course_id integer NOT NULL,
|
||||||
|
title text,
|
||||||
|
category text
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_course OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 275 (class 1259 OID 25656)
|
||||||
|
-- Name: dim_date; Type: TABLE; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_date (
|
||||||
|
date date NOT NULL,
|
||||||
|
year integer,
|
||||||
|
month integer,
|
||||||
|
day integer,
|
||||||
|
weekday text
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_date OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 274 (class 1259 OID 25643)
|
||||||
|
-- Name: dim_lesson; Type: TABLE; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_lesson (
|
||||||
|
lesson_id integer NOT NULL,
|
||||||
|
title text,
|
||||||
|
duration_min integer,
|
||||||
|
course_id integer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_lesson OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 272 (class 1259 OID 25627)
|
||||||
|
-- Name: dim_user; Type: TABLE; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_user (
|
||||||
|
user_id integer NOT NULL,
|
||||||
|
name text,
|
||||||
|
age integer,
|
||||||
|
email text,
|
||||||
|
registration_date date
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_user OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 276 (class 1259 OID 25872)
|
||||||
|
-- Name: enrollments; Type: TABLE; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE core.enrollments (
|
||||||
|
user_id integer,
|
||||||
|
course_id integer,
|
||||||
|
enrolled_at timestamp without time zone
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.enrollments OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 277 (class 1259 OID 25885)
|
||||||
|
-- Name: fact_lesson_views; Type: TABLE; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE core.fact_lesson_views (
|
||||||
|
user_id integer,
|
||||||
|
lesson_id integer,
|
||||||
|
course_id integer,
|
||||||
|
viewed_at timestamp without time zone
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.fact_lesson_views OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 268 (class 1259 OID 25615)
|
||||||
|
-- Name: courses; Type: TABLE; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE raw.courses (
|
||||||
|
id integer,
|
||||||
|
title character varying(50),
|
||||||
|
category character varying(50),
|
||||||
|
created_at character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.courses OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 270 (class 1259 OID 25621)
|
||||||
|
-- Name: enrollments; Type: TABLE; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE raw.enrollments (
|
||||||
|
id integer,
|
||||||
|
user_id integer,
|
||||||
|
course_id integer,
|
||||||
|
enrolled_at character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.enrollments OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 271 (class 1259 OID 25624)
|
||||||
|
-- Name: lesson_views; Type: TABLE; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE raw.lesson_views (
|
||||||
|
id integer,
|
||||||
|
user_id integer,
|
||||||
|
lesson_id integer,
|
||||||
|
viewed_at character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.lesson_views OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 269 (class 1259 OID 25618)
|
||||||
|
-- Name: lessons; Type: TABLE; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE raw.lessons (
|
||||||
|
id integer,
|
||||||
|
course_id integer,
|
||||||
|
title character varying(50),
|
||||||
|
duration_min integer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.lessons OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 267 (class 1259 OID 25612)
|
||||||
|
-- Name: users; Type: TABLE; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE raw.users (
|
||||||
|
id integer,
|
||||||
|
name character varying(50),
|
||||||
|
age integer,
|
||||||
|
email character varying(50),
|
||||||
|
registration_date character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.users OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2506 (class 0 OID 25635)
|
||||||
|
-- Dependencies: 273
|
||||||
|
-- Data for Name: dim_course; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.dim_course (course_id, title, category) FROM stdin;
|
||||||
|
2 Python для анализа данных programming
|
||||||
|
1 SQL для начинающих data
|
||||||
|
3 BI с нуля business
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2508 (class 0 OID 25656)
|
||||||
|
-- Dependencies: 275
|
||||||
|
-- Data for Name: dim_date; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.dim_date (date, year, month, day, weekday) FROM stdin;
|
||||||
|
2023-01-15 2023 1 15 Sunday
|
||||||
|
2023-01-16 2023 1 16 Monday
|
||||||
|
2023-01-21 2023 1 21 Saturday
|
||||||
|
2023-01-20 2023 1 20 Friday
|
||||||
|
2023-03-05 2023 3 5 Sunday
|
||||||
|
2023-02-01 2023 2 1 Wednesday
|
||||||
|
2023-04-02 2023 4 2 Sunday
|
||||||
|
2023-03-06 2023 3 6 Monday
|
||||||
|
2023-04-01 2023 4 1 Saturday
|
||||||
|
2023-04-03 2023 4 3 Monday
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2507 (class 0 OID 25643)
|
||||||
|
-- Dependencies: 274
|
||||||
|
-- Data for Name: dim_lesson; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.dim_lesson (lesson_id, title, duration_min, course_id) FROM stdin;
|
||||||
|
4 Основы BI 12 3
|
||||||
|
5 Метрики и дашборды 18 3
|
||||||
|
2 JOIN 15 1
|
||||||
|
1 SELECT и FROM 10 1
|
||||||
|
3 Pandas 20 2
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2505 (class 0 OID 25627)
|
||||||
|
-- Dependencies: 272
|
||||||
|
-- Data for Name: dim_user; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.dim_user (user_id, name, age, email, registration_date) FROM stdin;
|
||||||
|
3 Charlie 22 charlie@mail.com 2023-02-20
|
||||||
|
1 Alice 25 alice@mail.com 2023-01-10
|
||||||
|
2 Bob 30 bob@gmail.com 2023-02-05
|
||||||
|
5 Ethan 35 ethan@gmail.com 2023-03-10
|
||||||
|
4 Diana 28 diana@mail.com 2023-03-01
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2509 (class 0 OID 25872)
|
||||||
|
-- Dependencies: 276
|
||||||
|
-- Data for Name: enrollments; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.enrollments (user_id, course_id, enrolled_at) FROM stdin;
|
||||||
|
4 3 2023-04-01 00:00:00
|
||||||
|
1 2 2023-02-01 00:00:00
|
||||||
|
2 1 2023-01-20 00:00:00
|
||||||
|
1 1 2023-01-15 00:00:00
|
||||||
|
3 2 2023-03-05 00:00:00
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2510 (class 0 OID 25885)
|
||||||
|
-- Dependencies: 277
|
||||||
|
-- Data for Name: fact_lesson_views; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.fact_lesson_views (user_id, lesson_id, course_id, viewed_at) FROM stdin;
|
||||||
|
2 1 1 2023-01-21 09:00:00
|
||||||
|
1 2 1 2023-01-16 10:15:00
|
||||||
|
3 3 2 2023-03-06 12:00:00
|
||||||
|
1 1 1 2023-01-16 10:00:00
|
||||||
|
4 4 3 2023-04-02 10:00:00
|
||||||
|
4 5 3 2023-04-03 10:00:00
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2501 (class 0 OID 25615)
|
||||||
|
-- Dependencies: 268
|
||||||
|
-- Data for Name: courses; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.courses (id, title, category, created_at) FROM stdin;
|
||||||
|
3 BI с нуля business 2023-03-01
|
||||||
|
1 SQL для начинающих data 2023-01-01
|
||||||
|
2 Python для анализа данных programming 2023-01-15
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2503 (class 0 OID 25621)
|
||||||
|
-- Dependencies: 270
|
||||||
|
-- Data for Name: enrollments; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.enrollments (id, user_id, course_id, enrolled_at) FROM stdin;
|
||||||
|
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
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2504 (class 0 OID 25624)
|
||||||
|
-- Dependencies: 271
|
||||||
|
-- Data for Name: lesson_views; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.lesson_views (id, user_id, lesson_id, viewed_at) FROM stdin;
|
||||||
|
2 1 2 2023-01-16 10:15:00.000
|
||||||
|
1 1 1 2023-01-16 10:00:00.000
|
||||||
|
3 2 1 2023-01-21 09:00:00.000
|
||||||
|
5 4 4 2023-04-02 10:00:00.000
|
||||||
|
4 3 3 2023-03-06 12:00:00.000
|
||||||
|
6 4 5 2023-04-03 10:00:00.000
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2502 (class 0 OID 25618)
|
||||||
|
-- Dependencies: 269
|
||||||
|
-- Data for Name: lessons; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.lessons (id, course_id, title, duration_min) FROM stdin;
|
||||||
|
1 1 SELECT и FROM 10
|
||||||
|
2 1 JOIN 15
|
||||||
|
3 2 Pandas 20
|
||||||
|
4 3 Основы BI 12
|
||||||
|
5 3 Метрики и дашборды 18
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2500 (class 0 OID 25612)
|
||||||
|
-- Dependencies: 267
|
||||||
|
-- Data for Name: users; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.users (id, name, age, email, registration_date) FROM stdin;
|
||||||
|
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
|
||||||
|
5 Ethan 35 ethan@gmail.com 2023-03-10
|
||||||
|
4 Diana 28 diana@mail.com 2023-03-01
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2314 (class 2606 OID 25642)
|
||||||
|
-- Name: dim_course dim_course_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_course
|
||||||
|
ADD CONSTRAINT dim_course_pkey PRIMARY KEY (course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2319 (class 2606 OID 25663)
|
||||||
|
-- Name: dim_date dim_date_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_date
|
||||||
|
ADD CONSTRAINT dim_date_pkey PRIMARY KEY (date);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2316 (class 2606 OID 25650)
|
||||||
|
-- Name: dim_lesson dim_lesson_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_lesson
|
||||||
|
ADD CONSTRAINT dim_lesson_pkey PRIMARY KEY (lesson_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2312 (class 2606 OID 25634)
|
||||||
|
-- Name: dim_user dim_user_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_user
|
||||||
|
ADD CONSTRAINT dim_user_pkey PRIMARY KEY (user_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2317 (class 1259 OID 25906)
|
||||||
|
-- Name: idx_dim_lesson_course_id; Type: INDEX; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
1) Создание INDEX на таблицы в CORE-слое
|
||||||
|
*/
|
||||||
|
|
||||||
|
CREATE INDEX idx_dim_lesson_course_id ON core.dim_lesson USING btree (course_id);
|
||||||
|
|
||||||
|
CREATE INDEX idx_enrollments_course_id ON core.enrollments USING btree (course_id);
|
||||||
|
|
||||||
|
CREATE INDEX idx_fact_views_course_id ON core.fact_lesson_views USING btree (course_id);
|
||||||
|
|
||||||
|
CREATE INDEX idx_fact_views_course_viewed_at ON core.fact_lesson_views USING btree (course_id, viewed_at);
|
||||||
|
|
||||||
|
CREATE INDEX idx_fact_views_lesson_id ON core.fact_lesson_views USING btree (lesson_id);
|
||||||
|
|
||||||
|
CREATE INDEX idx_fact_views_user_id ON core.fact_lesson_views USING btree (user_id);
|
||||||
|
|
||||||
|
CREATE INDEX idx_fact_views_user_viewed_at ON core.fact_lesson_views USING btree (user_id, viewed_at);
|
||||||
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_lesson
|
||||||
|
ADD CONSTRAINT dim_lesson_course_id_fkey FOREIGN KEY (course_id) REFERENCES core.dim_course(course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2327 (class 2606 OID 25880)
|
||||||
|
-- Name: enrollments enrollments_course_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.enrollments
|
||||||
|
ADD CONSTRAINT enrollments_course_id_fkey FOREIGN KEY (course_id) REFERENCES core.dim_course(course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2328 (class 2606 OID 25875)
|
||||||
|
-- Name: enrollments enrollments_user_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.enrollments
|
||||||
|
ADD CONSTRAINT enrollments_user_id_fkey FOREIGN KEY (user_id) REFERENCES core.dim_user(user_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2329 (class 2606 OID 25898)
|
||||||
|
-- Name: fact_lesson_views fact_lesson_views_course_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.fact_lesson_views
|
||||||
|
ADD CONSTRAINT fact_lesson_views_course_id_fkey FOREIGN KEY (course_id) REFERENCES core.dim_course(course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2330 (class 2606 OID 25893)
|
||||||
|
-- Name: fact_lesson_views fact_lesson_views_lesson_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.fact_lesson_views
|
||||||
|
ADD CONSTRAINT fact_lesson_views_lesson_id_fkey FOREIGN KEY (lesson_id) REFERENCES core.dim_lesson(lesson_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2331 (class 2606 OID 25888)
|
||||||
|
-- Name: fact_lesson_views fact_lesson_views_user_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.fact_lesson_views
|
||||||
|
ADD CONSTRAINT fact_lesson_views_user_id_fkey FOREIGN KEY (user_id) REFERENCES core.dim_user(user_id);
|
||||||
|
|
||||||
|
|
||||||
|
-- Completed on 2026-01-17 22:42:02
|
||||||
|
|
||||||
|
--
|
||||||
|
-- PostgreSQL database dump complete
|
||||||
|
--
|
||||||
|
|
||||||
@@ -0,0 +1,417 @@
|
|||||||
|
SET statement_timeout = 0;
|
||||||
|
SET lock_timeout = 0;
|
||||||
|
SET idle_in_transaction_session_timeout = 0;
|
||||||
|
SET transaction_timeout = 0;
|
||||||
|
SET client_encoding = 'UTF8';
|
||||||
|
SET standard_conforming_strings = on;
|
||||||
|
SELECT pg_catalog.set_config('search_path', '', false);
|
||||||
|
SET check_function_bodies = false;
|
||||||
|
SET xmloption = content;
|
||||||
|
SET client_min_messages = warning;
|
||||||
|
SET row_security = off;
|
||||||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- ЭТАП 1
|
||||||
|
-- 1.1 - СОЗДАНИЕ СХЕМ
|
||||||
|
|
||||||
|
CREATE SCHEMA core;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER SCHEMA core OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE SCHEMA dm;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER SCHEMA dm OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE SCHEMA raw;
|
||||||
|
|
||||||
|
|
||||||
|
ALTER SCHEMA raw OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
SET default_tablespace = '';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- 1.2 - Создание raw-таблиц
|
||||||
|
|
||||||
|
CREATE TABLE raw.courses (
|
||||||
|
id integer,
|
||||||
|
title character varying(50),
|
||||||
|
category character varying(50),
|
||||||
|
created_at character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.courses OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE raw.enrollments (
|
||||||
|
id integer,
|
||||||
|
user_id integer,
|
||||||
|
course_id integer,
|
||||||
|
enrolled_at character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.enrollments OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE raw.lesson_views (
|
||||||
|
id integer,
|
||||||
|
user_id integer,
|
||||||
|
lesson_id integer,
|
||||||
|
viewed_at character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.lesson_views OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE raw.lessons (
|
||||||
|
id integer,
|
||||||
|
course_id integer,
|
||||||
|
title character varying(50),
|
||||||
|
duration_min integer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.lessons OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE raw.users (
|
||||||
|
id integer,
|
||||||
|
name character varying(50),
|
||||||
|
age integer,
|
||||||
|
email character varying(50),
|
||||||
|
registration_date character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE raw.users OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- Этап 3. Слой Core
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_course (
|
||||||
|
course_id integer NOT NULL,
|
||||||
|
title text,
|
||||||
|
category text
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_course OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_date (
|
||||||
|
date date NOT NULL,
|
||||||
|
year integer,
|
||||||
|
month integer,
|
||||||
|
day integer,
|
||||||
|
weekday text
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_date OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_lesson (
|
||||||
|
lesson_id integer NOT NULL,
|
||||||
|
title text,
|
||||||
|
duration_min integer,
|
||||||
|
course_id integer
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_lesson OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE core.dim_user (
|
||||||
|
user_id integer NOT NULL,
|
||||||
|
name text,
|
||||||
|
age integer,
|
||||||
|
email text,
|
||||||
|
registration_date date
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.dim_user OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE core.enrollments (
|
||||||
|
user_id integer,
|
||||||
|
course_id integer,
|
||||||
|
enrolled_at timestamp without time zone
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.enrollments OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE core.fact_lesson_views (
|
||||||
|
user_id integer,
|
||||||
|
lesson_id integer,
|
||||||
|
course_id integer,
|
||||||
|
viewed_at timestamp without time zone
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE core.fact_lesson_views OWNER TO dsolovianov;
|
||||||
|
|
||||||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
COPY core.dim_course (course_id, title, category) FROM stdin;
|
||||||
|
2 Python для анализа данных programming
|
||||||
|
1 SQL для начинающих data
|
||||||
|
3 BI с нуля business
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
COPY core.dim_date (date, year, month, day, weekday) FROM stdin;
|
||||||
|
2023-01-15 2023 1 15 Sunday
|
||||||
|
2023-01-16 2023 1 16 Monday
|
||||||
|
2023-01-21 2023 1 21 Saturday
|
||||||
|
2023-01-20 2023 1 20 Friday
|
||||||
|
2023-03-05 2023 3 5 Sunday
|
||||||
|
2023-02-01 2023 2 1 Wednesday
|
||||||
|
2023-04-02 2023 4 2 Sunday
|
||||||
|
2023-03-06 2023 3 6 Monday
|
||||||
|
2023-04-01 2023 4 1 Saturday
|
||||||
|
2023-04-03 2023 4 3 Monday
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2500 (class 0 OID 25643)
|
||||||
|
-- Dependencies: 274
|
||||||
|
-- Data for Name: dim_lesson; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.dim_lesson (lesson_id, title, duration_min, course_id) FROM stdin;
|
||||||
|
4 Основы BI 12 3
|
||||||
|
5 Метрики и дашборды 18 3
|
||||||
|
2 JOIN 15 1
|
||||||
|
1 SELECT и FROM 10 1
|
||||||
|
3 Pandas 20 2
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2498 (class 0 OID 25627)
|
||||||
|
-- Dependencies: 272
|
||||||
|
-- Data for Name: dim_user; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.dim_user (user_id, name, age, email, registration_date) FROM stdin;
|
||||||
|
3 Charlie 22 charlie@mail.com 2023-02-20
|
||||||
|
1 Alice 25 alice@mail.com 2023-01-10
|
||||||
|
2 Bob 30 bob@gmail.com 2023-02-05
|
||||||
|
5 Ethan 35 ethan@gmail.com 2023-03-10
|
||||||
|
4 Diana 28 diana@mail.com 2023-03-01
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2502 (class 0 OID 25872)
|
||||||
|
-- Dependencies: 276
|
||||||
|
-- Data for Name: enrollments; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.enrollments (user_id, course_id, enrolled_at) FROM stdin;
|
||||||
|
4 3 2023-04-01 00:00:00
|
||||||
|
1 2 2023-02-01 00:00:00
|
||||||
|
2 1 2023-01-20 00:00:00
|
||||||
|
1 1 2023-01-15 00:00:00
|
||||||
|
3 2 2023-03-05 00:00:00
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2503 (class 0 OID 25885)
|
||||||
|
-- Dependencies: 277
|
||||||
|
-- Data for Name: fact_lesson_views; Type: TABLE DATA; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY core.fact_lesson_views (user_id, lesson_id, course_id, viewed_at) FROM stdin;
|
||||||
|
2 1 1 2023-01-21 09:00:00
|
||||||
|
1 2 1 2023-01-16 10:15:00
|
||||||
|
3 3 2 2023-03-06 12:00:00
|
||||||
|
1 1 1 2023-01-16 10:00:00
|
||||||
|
4 4 3 2023-04-02 10:00:00
|
||||||
|
4 5 3 2023-04-03 10:00:00
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2494 (class 0 OID 25615)
|
||||||
|
-- Dependencies: 268
|
||||||
|
-- Data for Name: courses; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.courses (id, title, category, created_at) FROM stdin;
|
||||||
|
3 BI с нуля business 2023-03-01
|
||||||
|
1 SQL для начинающих data 2023-01-01
|
||||||
|
2 Python для анализа данных programming 2023-01-15
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2496 (class 0 OID 25621)
|
||||||
|
-- Dependencies: 270
|
||||||
|
-- Data for Name: enrollments; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.enrollments (id, user_id, course_id, enrolled_at) FROM stdin;
|
||||||
|
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
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2497 (class 0 OID 25624)
|
||||||
|
-- Dependencies: 271
|
||||||
|
-- Data for Name: lesson_views; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.lesson_views (id, user_id, lesson_id, viewed_at) FROM stdin;
|
||||||
|
2 1 2 2023-01-16 10:15:00.000
|
||||||
|
1 1 1 2023-01-16 10:00:00.000
|
||||||
|
3 2 1 2023-01-21 09:00:00.000
|
||||||
|
5 4 4 2023-04-02 10:00:00.000
|
||||||
|
4 3 3 2023-03-06 12:00:00.000
|
||||||
|
6 4 5 2023-04-03 10:00:00.000
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2495 (class 0 OID 25618)
|
||||||
|
-- Dependencies: 269
|
||||||
|
-- Data for Name: lessons; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.lessons (id, course_id, title, duration_min) FROM stdin;
|
||||||
|
1 1 SELECT и FROM 10
|
||||||
|
2 1 JOIN 15
|
||||||
|
3 2 Pandas 20
|
||||||
|
4 3 Основы BI 12
|
||||||
|
5 3 Метрики и дашборды 18
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2493 (class 0 OID 25612)
|
||||||
|
-- Dependencies: 267
|
||||||
|
-- Data for Name: users; Type: TABLE DATA; Schema: raw; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
COPY raw.users (id, name, age, email, registration_date) FROM stdin;
|
||||||
|
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
|
||||||
|
5 Ethan 35 ethan@gmail.com 2023-03-10
|
||||||
|
4 Diana 28 diana@mail.com 2023-03-01
|
||||||
|
\.
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2314 (class 2606 OID 25642)
|
||||||
|
-- Name: dim_course dim_course_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_course
|
||||||
|
ADD CONSTRAINT dim_course_pkey PRIMARY KEY (course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2318 (class 2606 OID 25663)
|
||||||
|
-- Name: dim_date dim_date_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_date
|
||||||
|
ADD CONSTRAINT dim_date_pkey PRIMARY KEY (date);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2316 (class 2606 OID 25650)
|
||||||
|
-- Name: dim_lesson dim_lesson_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_lesson
|
||||||
|
ADD CONSTRAINT dim_lesson_pkey PRIMARY KEY (lesson_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2312 (class 2606 OID 25634)
|
||||||
|
-- Name: dim_user dim_user_pkey; Type: CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_user
|
||||||
|
ADD CONSTRAINT dim_user_pkey PRIMARY KEY (user_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2319 (class 2606 OID 25651)
|
||||||
|
-- Name: dim_lesson dim_lesson_course_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.dim_lesson
|
||||||
|
ADD CONSTRAINT dim_lesson_course_id_fkey FOREIGN KEY (course_id) REFERENCES core.dim_course(course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2320 (class 2606 OID 25880)
|
||||||
|
-- Name: enrollments enrollments_course_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.enrollments
|
||||||
|
ADD CONSTRAINT enrollments_course_id_fkey FOREIGN KEY (course_id) REFERENCES core.dim_course(course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2321 (class 2606 OID 25875)
|
||||||
|
-- Name: enrollments enrollments_user_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.enrollments
|
||||||
|
ADD CONSTRAINT enrollments_user_id_fkey FOREIGN KEY (user_id) REFERENCES core.dim_user(user_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2322 (class 2606 OID 25898)
|
||||||
|
-- Name: fact_lesson_views fact_lesson_views_course_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.fact_lesson_views
|
||||||
|
ADD CONSTRAINT fact_lesson_views_course_id_fkey FOREIGN KEY (course_id) REFERENCES core.dim_course(course_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2323 (class 2606 OID 25893)
|
||||||
|
-- Name: fact_lesson_views fact_lesson_views_lesson_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.fact_lesson_views
|
||||||
|
ADD CONSTRAINT fact_lesson_views_lesson_id_fkey FOREIGN KEY (lesson_id) REFERENCES core.dim_lesson(lesson_id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2324 (class 2606 OID 25888)
|
||||||
|
-- Name: fact_lesson_views fact_lesson_views_user_id_fkey; Type: FK CONSTRAINT; Schema: core; Owner: dsolovianov
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY core.fact_lesson_views
|
||||||
|
ADD CONSTRAINT fact_lesson_views_user_id_fkey FOREIGN KEY (user_id) REFERENCES core.dim_user(user_id);
|
||||||
|
|
||||||
|
|
||||||
|
-- Completed on 2026-01-14 21:29:24
|
||||||
|
|
||||||
|
--
|
||||||
|
-- PostgreSQL database dump complete
|
||||||
|
--
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
"id","title","category","created_at"
|
||||||
|
1,SQL для начинающих,data,2023-01-01
|
||||||
|
2,Python для анализа данных,programming,2023-01-15
|
||||||
|
3,BI с нуля,business,2023-03-01
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
"id","user_id","course_id","enrolled_at"
|
||||||
|
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
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
"id","user_id","lesson_id","viewed_at"
|
||||||
|
1,1,1,2023-01-16 10:00:00.000
|
||||||
|
2,1,2,2023-01-16 10:15:00.000
|
||||||
|
3,2,1,2023-01-21 09:00:00.000
|
||||||
|
4,3,3,2023-03-06 12:00:00.000
|
||||||
|
5,4,4,2023-04-02 10:00:00.000
|
||||||
|
6,4,5,2023-04-03 10:00:00.000
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
"id","course_id","title","duration_min"
|
||||||
|
1,1,SELECT и FROM,10
|
||||||
|
2,1,JOIN,15
|
||||||
|
3,2,Pandas,20
|
||||||
|
4,3,Основы BI,12
|
||||||
|
5,3,Метрики и дашборды,18
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
"id","name","age","email","registration_date"
|
||||||
|
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
|
||||||
|
@@ -0,0 +1,96 @@
|
|||||||
|
-- удалить таблицу если раньше создавали
|
||||||
|
DROP TABLE IF EXISTS mdrozdov.core_fact_lesson_views
|
||||||
|
ON CLUSTER clickhouse_cluster;
|
||||||
|
|
||||||
|
-- таблицы измерений
|
||||||
|
-- user dimension
|
||||||
|
CREATE TABLE mdrozdov.core_dim_user
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
user_id Int32,
|
||||||
|
name String,
|
||||||
|
age Int32,
|
||||||
|
email String,
|
||||||
|
registration_date Date
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/core_dim_user',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY user_id;
|
||||||
|
|
||||||
|
-- course dimension
|
||||||
|
CREATE TABLE mdrozdov.core_dim_course
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
course_id Int32,
|
||||||
|
title String,
|
||||||
|
category String
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/core_dim_course',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY course_id;
|
||||||
|
|
||||||
|
-- lesson dimension
|
||||||
|
CREATE TABLE mdrozdov.core_dim_lesson
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
lesson_id Int32,
|
||||||
|
title String,
|
||||||
|
duration_min Int32,
|
||||||
|
course_id Int32,
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/core_dim_lesson2',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY (course_id, lesson_id);
|
||||||
|
|
||||||
|
-- date dimension
|
||||||
|
CREATE TABLE mdrozdov.core_dim_date
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
date DATE,
|
||||||
|
year Int32,
|
||||||
|
month Int32,
|
||||||
|
day Int32,
|
||||||
|
weekday String
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/core_dim_date',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY date;
|
||||||
|
|
||||||
|
|
||||||
|
-- таблицы фактов
|
||||||
|
-- core_enrollments
|
||||||
|
CREATE TABLE mdrozdov.core_enrollments
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
user_id Int32,
|
||||||
|
course_id Int32,
|
||||||
|
enrolled_at DateTime64(3)
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/core_enrollments',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY course_id;
|
||||||
|
|
||||||
|
-- core_fact_lesson_views
|
||||||
|
CREATE TABLE mdrozdov.core_fact_lesson_views
|
||||||
|
ON CLUSTER clickhouse_cluster
|
||||||
|
(
|
||||||
|
user_id Int32,
|
||||||
|
lesson_id Int32,
|
||||||
|
course_id Int32,
|
||||||
|
viewed_at DateTime64(3)
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/core_fact_lesson_views',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY course_id;
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
--lesson_popularity_summary data mart
|
||||||
|
create table mdrozdov.dm_lesson_popularity_summary
|
||||||
|
ON CLUSTER clickhouse_cluster(
|
||||||
|
lesson_id Int32,
|
||||||
|
lesson_title String,
|
||||||
|
course_id Int32,
|
||||||
|
course_title String,
|
||||||
|
total_views Int32,
|
||||||
|
unique_users Int32,
|
||||||
|
first_view DateTime64(3),
|
||||||
|
last_view DateTime64(3)
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/dm_lesson_popularity_summary1',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY (lesson_id, course_id);
|
||||||
|
|
||||||
|
-- здесь тригер таблица dim_lesson, хотя это не совсем правильно, но мы и состояние не храним
|
||||||
|
-- по сути таблица тригер должна быть fact_lesson_views, но right join будет плохо
|
||||||
|
-- а если не делать right join, то можем потерять логику, потому что left join от fact_lesson_view
|
||||||
|
-- логически теряет данные, если урок не был просмотрен
|
||||||
|
-- но оно хотя бы работает
|
||||||
|
create materialized view mdrozdov.lesson_popularity_summary
|
||||||
|
on CLUSTER clickhouse_cluster
|
||||||
|
to mdrozdov.dm_lesson_popularity_summary as
|
||||||
|
select
|
||||||
|
dl.lesson_id as lesson_id,
|
||||||
|
dl.title as lesson_title,
|
||||||
|
dl.course_id as course_id,
|
||||||
|
dc.title as course_title,
|
||||||
|
count(flv.lesson_id) as total_views,
|
||||||
|
count(distinct flv.user_id) as unique_users,
|
||||||
|
min(flv.viewed_at) as first_view,
|
||||||
|
max(flv.viewed_at) as last_view
|
||||||
|
from mdrozdov.core_dim_lesson dl
|
||||||
|
left join mdrozdov.core_dim_course dc
|
||||||
|
on dl.course_id = dc.course_id
|
||||||
|
left join mdrozdov.core_fact_lesson_views flv
|
||||||
|
on dl.lesson_id = flv.lesson_id
|
||||||
|
group by dl.lesson_id, dl.title, dl.course_id, dc.title
|
||||||
|
|
||||||
|
--inactive_users_summary
|
||||||
|
create table mdrozdov.dm_inactive_users_summary
|
||||||
|
ON CLUSTER clickhouse_cluster(
|
||||||
|
user_id Int32,
|
||||||
|
name String,
|
||||||
|
email String,
|
||||||
|
age Int32,
|
||||||
|
registered_courses_count Int32,
|
||||||
|
registration_date Date
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/dm_inactive_users_summary1',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY user_id
|
||||||
|
|
||||||
|
-- здесь тригер таблица dim_user
|
||||||
|
-- но почему-то при вставке в dim_user новые строки в таргет таблицу не добавляются
|
||||||
|
create materialized view mdrozdov.inactive_users_summary
|
||||||
|
on CLUSTER clickhouse_cluster
|
||||||
|
to mdrozdov.dm_inactive_users_summary
|
||||||
|
as
|
||||||
|
select
|
||||||
|
du.user_id as user_id,
|
||||||
|
du.name as name,
|
||||||
|
du.email as email,
|
||||||
|
du.age as age,
|
||||||
|
count(e.course_id) as registered_courses_count,
|
||||||
|
du.registration_date as registration_date
|
||||||
|
from mdrozdov.core_dim_user du
|
||||||
|
left join mdrozdov.core_enrollments e
|
||||||
|
on du.user_id = e.user_id
|
||||||
|
left join mdrozdov.core_fact_lesson_views flv
|
||||||
|
on du.user_id = flv.user_id
|
||||||
|
where flv.user_id is null
|
||||||
|
group by du.user_id, du.name, du.email, du.age, du.registration_date
|
||||||
|
|
||||||
|
-- course_completion_rate
|
||||||
|
create table mdrozdov.dm_course_completion_rate
|
||||||
|
ON CLUSTER clickhouse_cluster(
|
||||||
|
user_id Int32,
|
||||||
|
user_name String,
|
||||||
|
course_id Int32,
|
||||||
|
course_title String,
|
||||||
|
lessons_in_course Int32,
|
||||||
|
lessons_viewed Int32,
|
||||||
|
completion_rate Decimal(4, 3)
|
||||||
|
)
|
||||||
|
ENGINE = ReplicatedMergeTree(
|
||||||
|
'/clickhouse/tables/{shard}/mdrozdov/dm_course_completion_rate',
|
||||||
|
'{replica}'
|
||||||
|
)
|
||||||
|
ORDER BY (user_id, course_id)
|
||||||
|
|
||||||
|
-- здесь тригер таблица core_enrollments и тут все четко по логике и в работе
|
||||||
|
create materialized view mdrozdov.course_completion_rate
|
||||||
|
on CLUSTER clickhouse_cluster
|
||||||
|
to mdrozdov.dm_course_completion_rate as
|
||||||
|
with total_lessons_per_course as(
|
||||||
|
select
|
||||||
|
course_id,
|
||||||
|
count(*) as lessons_in_course
|
||||||
|
from mdrozdov.core_dim_lesson
|
||||||
|
group by course_id
|
||||||
|
), lessons_viewed as (
|
||||||
|
select
|
||||||
|
user_id,
|
||||||
|
course_id,
|
||||||
|
count(*) as lessons_viewed
|
||||||
|
from mdrozdov.core_fact_lesson_views flv
|
||||||
|
group by user_id, course_id
|
||||||
|
)
|
||||||
|
select
|
||||||
|
du.user_id as user_id,
|
||||||
|
du.name as user_name,
|
||||||
|
dc.course_id as course_id,
|
||||||
|
dc.title as course_title,
|
||||||
|
tlpc.lessons_in_course as lessons_in_course,
|
||||||
|
coalesce(lv.lessons_viewed, 0) as lessons_viewed,
|
||||||
|
round(
|
||||||
|
coalesce(
|
||||||
|
coalesce(lv.lessons_viewed, 0)*1.0/nullif(tlpc.lessons_in_course, 0), 0
|
||||||
|
), 2) as completion_rate
|
||||||
|
from mdrozdov.core_enrollments e
|
||||||
|
join mdrozdov.core_dim_user du
|
||||||
|
on e.user_id = du.user_id
|
||||||
|
join total_lessons_per_course tlpc
|
||||||
|
on tlpc.course_id = e.course_id
|
||||||
|
join mdrozdov.core_dim_course dc
|
||||||
|
on e.course_id = dc.course_id
|
||||||
|
left join lessons_viewed lv
|
||||||
|
on du.user_id = lv.user_id and dc.course_id = lv.course_id
|
||||||
|
|
||||||
|
--данные из-за несовпадения названий столбцов в импорте/экспорте пришлось удалять, короче проще вручную
|
||||||
|
-- их добавить
|
||||||
|
insert into mdrozdov.core_fact_lesson_views(user_id, lesson_id, course_id, viewed_at) values
|
||||||
|
(1, 1, 1, '2023-01-16 10:00:00'),
|
||||||
|
(1, 2, 1, '2023-01-16 10:15:00'),
|
||||||
|
(2, 1, 1, '2023-01-21 09:00:00'),
|
||||||
|
(3, 3, 2, '2023-03-06 12:00:00'),
|
||||||
|
(4, 4, 3, '2023-04-02 10:00:00'),
|
||||||
|
(4, 5, 3, '2023-04-03 10:00:00')
|
||||||
|
|
||||||
|
insert into enrollments (user_id, course_id, enrolled_at) values
|
||||||
|
(1, 1, '2023-01-15'),
|
||||||
|
(1, 2, '2023-02-01'),
|
||||||
|
(2, 1, '2023-01-20'),
|
||||||
|
(3, 2, '2023-03-05'),
|
||||||
|
(4, 3, '2023-04-01')
|
||||||
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
-- Топ-5 уроков с наименьшим количеством уникальных пользователей
|
||||||
|
SELECT
|
||||||
|
lesson_title,
|
||||||
|
course_title,
|
||||||
|
unique_users
|
||||||
|
FROM lesson_popularity_summary
|
||||||
|
ORDER BY unique_users ASC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- Пользователи без зарегистрированных курсов
|
||||||
|
SELECT
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
registration_date
|
||||||
|
FROM inactive_users_summary
|
||||||
|
WHERE registered_courses_count = 0
|
||||||
|
ORDER BY registration_date ASC;
|
||||||
|
|
||||||
|
-- Список курсов с минимальной средней степенью завершения
|
||||||
|
SELECT
|
||||||
|
course_title,
|
||||||
|
AVG(completion_rate) AS avg_completion
|
||||||
|
FROM course_completion_rate
|
||||||
|
GROUP BY course_title
|
||||||
|
ORDER BY avg_completion ASC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- Мини отчет:
|
||||||
|
/*
|
||||||
|
Таблица lesson_popularity_summary
|
||||||
|
Выбранные поля для проверки:
|
||||||
|
total_views - агрегат count
|
||||||
|
first_view - агрегат min
|
||||||
|
оба совпадают
|
||||||
|
Таблица inactive_users_summary
|
||||||
|
Выбранные поля для проверки:
|
||||||
|
registered_courses_count - агрегат count
|
||||||
|
совпадает
|
||||||
|
Таблица course_completion_rate
|
||||||
|
Выбранные поля для проверки:
|
||||||
|
completion_rate - агрегат count
|
||||||
|
совпадает
|
||||||
|
Итог: в моем случае все значения совпали, возможно если бы это было не через простой MergeTree
|
||||||
|
все было бы хуже
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user