From 6c06823b68d718ddcfe49663bb997513dd3ea3de Mon Sep 17 00:00:00 2001 From: mnoskov Date: Wed, 22 Apr 2026 14:06:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=203.=20=D0=A1=D0=BB?= =?UTF-8?q?=D0=BE=D0=B9=20Core=20=E2=80=94=20=D0=BE=D0=B1=D0=BE=D0=B3?= =?UTF-8?q?=D0=B0=D1=89=D1=91=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5.=20=D0=9F=D0=B5=D1=82=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82:=20DWH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Пет проект: DWH/Step_3_core_layer.sql | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 mnoskov/greenplum/Пет проект: DWH/Step_3_core_layer.sql diff --git a/mnoskov/greenplum/Пет проект: DWH/Step_3_core_layer.sql b/mnoskov/greenplum/Пет проект: DWH/Step_3_core_layer.sql new file mode 100644 index 0000000..c21d4fa --- /dev/null +++ b/mnoskov/greenplum/Пет проект: DWH/Step_3_core_layer.sql @@ -0,0 +1,112 @@ +-- 4 + +--DROP TABLE IF EXISTS core.dim_user; +CREATE TABLE core.dim_user ( + user_id int PRIMARY KEY, + name text, + age int, + email text, + registration_date date +) DISTRIBUTED BY (user_id); + +--DROP TABLE IF EXISTS core.dim_course; +CREATE TABLE core.dim_course ( + course_id int PRIMARY KEY, + title text, + category text +) DISTRIBUTED BY (course_id); + +--DROP TABLE IF EXISTS core.dim_lesson; +CREATE TABLE core.dim_lesson ( + lesson_id int PRIMARY KEY, + title text, + duration_min int, + course_id int REFERENCES core.dim_course(course_id) +) DISTRIBUTED BY (lesson_id); + +--DROP TABLE IF EXISTS core.dim_date; +CREATE TABLE core.dim_date ( + date date PRIMARY KEY, + year int, + month int, + day int, + weekday text +) DISTRIBUTED BY (date); + + +-- 5 +--DROP TABLE IF EXISTS core.fact_lesson_views; +CREATE TABLE core.fact_lesson_views ( + user_id int REFERENCES core.dim_user(user_id), + lesson_id int REFERENCES core.dim_lesson(lesson_id), + course_id int REFERENCES core.dim_course(course_id), + viewed_at timestamp +) DISTRIBUTED BY (user_id); + +--DROP TABLE IF EXISTS core.enrollments; +CREATE TABLE core.enrollments ( + user_id int REFERENCES core.dim_user(user_id), + course_id int REFERENCES core.dim_course(course_id), + enrolled_at timestamp +) DISTRIBUTED BY (user_id); + + +--6 +INSERT INTO core.dim_user (user_id, name, age, email, registration_date) +SELECT DISTINCT + id::int AS user_id, + name::text, + age::int, + email::text, + registration_date::date +FROM raw.users +WHERE id IS NOT NULL AND email IS NOT NULL; + +INSERT INTO core.dim_course (course_id, title, category) +SELECT DISTINCT + id::int AS course_id, + title::text, + category::text +FROM + raw.courses +WHERE id IS NOT NULL AND title IS NOT NULL; + +INSERT INTO core.dim_lesson (lesson_id, title, duration_min, course_id) +SELECT DISTINCT + id::int AS lesson_id, + title::text, + duration_min::int, + course_id::int +FROM + raw.lessons +WHERE id IS NOT NULL; + +-- загуглил как заполнять: +INSERT INTO core.dim_date (date, year, month, day, weekday) +SELECT + d::date, + EXTRACT(YEAR FROM d)::int, + EXTRACT(MONTH FROM d)::int, + EXTRACT(DAY FROM d)::int, + to_char(d, 'day') +FROM + generate_series('2023-01-01'::date, '2025-12-31'::date, INTERVAL '1 day') AS d; + +INSERT INTO core.fact_lesson_views (user_id, lesson_id, course_id, viewed_at) +SELECT + lv.user_id::int, + lv.lesson_id::int, + l.course_id::int, + lv.viewed_at::timestamp +FROM + raw.lesson_views lv +JOIN + raw.lessons l ON lv.lesson_id = l.id + +INSERT INTO core.enrollments (user_id, course_id, enrolled_at) +SELECT + user_id::int, + course_id::int, + enrolled_at::timestamp +FROM + raw.enrollments; \ No newline at end of file