Files
homework/mdrozdov/greenplum/core_layer.sql
T
2026-01-31 03:29:26 +07:00

94 lines
2.3 KiB
SQL

-- Измерение пользователей
CREATE TABLE core.dim_user (
user_id INT PRIMARY KEY,
name TEXT,
age INT,
email TEXT,
registration_date DATE
)
distributed by (user_id);
-- Измерение курсов
CREATE TABLE core.dim_course (
course_id INT PRIMARY KEY,
title TEXT,
category TEXT
)
distributed by (course_id);
-- Измерение уроков
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);
-- Опционально: измерение времени
CREATE TABLE core.dim_date (
date DATE PRIMARY KEY,
year INT,
month INT,
day INT,
weekday TEXT
)
distributed replicated;
-- Таблицы фактов:
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 (course_id);
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 (course_id);
--ETL переброс данных из raw в core
INSERT INTO core.dim_user (user_id, name, age, email, registration_date)
SELECT DISTINCT
id::INT,
name::TEXT,
age::INT,
email::TEXT,
registration_date::DATE
FROM raw.users;
INSERT INTO core.dim_course (course_id, title, category)
SELECT DISTINCT
id::INT,
title::TEXT,
category::TEXT
FROM raw.courses;
INSERT INTO core.dim_lesson (lesson_id, title, duration_min, course_id)
SELECT DISTINCT
id::INT,
title::TEXT,
duration_min::INT,
course_id::INT
FROM raw.lessons;
-- Заполнение таблицы фактов
insert into core.fact_lesson_views (user_id, lesson_id, course_id, viewed_at)
select
lw.user_id,
lw.lesson_id,
l.course_id,
lw.viewed_at
from raw.lessons_views lw
join raw.lessons l on lw.lesson_id = l.id;
insert into core.enrollments (user_id, course_id, enrolled_at)
select
user_id,
course_id,
enrolled_at
from raw.enrollments;