Этап 3. Слой Core — обогащённые данные. Пет проект: DWH
This commit is contained in:
@@ -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;
|
||||||
Reference in New Issue
Block a user