РАБОТА НАД ОШИБКАМИ. Пет проект: DWH. Этап 4: Подготовка витрин в Greenplum.

This commit is contained in:
mnoskov
2026-04-28 04:30:01 +03:00
parent 4b51ffb724
commit 347334dc26
2 changed files with 15 additions and 4 deletions
@@ -157,6 +157,7 @@ SELECT
FROM FROM
generate_series('2023-01-01'::date, '2030-12-31'::date, INTERVAL '1 day') AS d; generate_series('2023-01-01'::date, '2030-12-31'::date, INTERVAL '1 day') AS d;
-- fact_lesson_views
INSERT INTO core.fact_lesson_views (user_id, lesson_id, course_id, viewed_at) INSERT INTO core.fact_lesson_views (user_id, lesson_id, course_id, viewed_at)
SELECT SELECT
raw_lv.user_id, raw_lv.user_id,
@@ -172,6 +173,7 @@ WHERE
AND raw_lv.user_id IS NOT NULL AND raw_lv.lesson_id IS NOT NULL AND raw_lv.user_id IS NOT NULL AND raw_lv.lesson_id IS NOT NULL
AND raw_l.course_id IS NOT NULL AND raw_lv.viewed_at IS NOT NULL; AND raw_l.course_id IS NOT NULL AND raw_lv.viewed_at IS NOT NULL;
-- enrollments
INSERT INTO core.enrollments (user_id, course_id, enrolled_at) INSERT INTO core.enrollments (user_id, course_id, enrolled_at)
SELECT SELECT
raw_e.user_id, raw_e.user_id,
@@ -38,13 +38,22 @@ SELECT
du.name AS user_name, du.name AS user_name,
du.email, du.email,
du.age, du.age,
0 AS enrollments_count, e.enrollments_count,
du.registration_date du.registration_date
FROM FROM
core.dim_user du core.dim_user du
LEFT JOIN (
SELECT
user_id,
count(course_id) AS enrollments_count
FROM
core.enrollments
GROUP BY
user_id
) e ON du.user_id = e.user_id
WHERE WHERE
NOT EXISTS (SELECT 1 FROM core.fact_lesson_views flv WHERE flv.user_id = du.user_id); NOT EXISTS (SELECT 1 FROM core.fact_lesson_views flv WHERE flv.user_id = du.user_id);
-- тут странно, в условии сказано зачем-то enrollment присоединять, но делается все и без него отлично -- интересно, что при проверки плана запроса, когда кусок с enrollments_count был в CTE, выдавал какую-то хуйню, а когда я засунул его в подзапрос, сразу инлексы заработали, и строки начали эффективней читаться
-- 9 -- 9
@@ -60,7 +69,7 @@ WITH results_dim_course_lesson AS (
JOIN JOIN
core.dim_lesson dl ON dc.course_id = dl.course_id core.dim_lesson dl ON dc.course_id = dl.course_id
GROUP BY GROUP BY
dc.course_id dc.course_id, dc.title
), ),
results_fact_lesson_views AS ( results_fact_lesson_views AS (
SELECT SELECT
@@ -79,7 +88,7 @@ SELECT
rdcl.title AS course_title, rdcl.title AS course_title,
rdcl.lessons_in_course, rdcl.lessons_in_course,
COALESCE(rflv.lessons_viewed, 0) AS lessons_viewed, COALESCE(rflv.lessons_viewed, 0) AS lessons_viewed,
round(COALESCE(rflv.lessons_viewed, 0) / NULLIF(rdcl.lessons_in_course, 0)::numeric, 2) AS completion_rate round(COALESCE(rflv.lessons_viewed, 0)::numeric / NULLIF(rdcl.lessons_in_course, 0), 2) AS completion_rate
FROM FROM
core.dim_user du core.dim_user du
JOIN JOIN