From 3297ddb2b5b478a070475f931850b8e4d6c315fe Mon Sep 17 00:00:00 2001 From: Batirbulat Date: Wed, 31 Dec 2025 17:51:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BF=D0=BE=20=D0=B2=D1=81=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bhabibullin/clickhouse/clickhouse_pet.sql | 50 ++++++++++++--------- bhabibullin/greenplum/pet_project_gp.sql | 17 +++---- bhabibullin/postgre/postrge_pet_project.sql | 12 +++-- 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/bhabibullin/clickhouse/clickhouse_pet.sql b/bhabibullin/clickhouse/clickhouse_pet.sql index 94ad016..404abdc 100644 --- a/bhabibullin/clickhouse/clickhouse_pet.sql +++ b/bhabibullin/clickhouse/clickhouse_pet.sql @@ -86,6 +86,8 @@ ORDER BY (lesson_id, course_id); - Дата первого и последнего просмотра */ +-- Основная таблица с AggregatingMergeTree + CREATE TABLE bhabibullin.lesson_popularity_summary ON CLUSTER clickhouse_cluster ( @@ -93,18 +95,19 @@ ON CLUSTER clickhouse_cluster lesson_title String, course_id UInt32, course_title String, - total_views UInt32, - unique_users UInt32, - first_view DateTime64(3, 'UTC'), - last_view DateTime64(3, 'UTC') + total_views AggregateFunction(sum, UInt64), + unique_users AggregateFunction(uniq, UInt32), + first_view AggregateFunction(min, DateTime64(3, 'UTC')), + last_view AggregateFunction(max, DateTime64(3, 'UTC')) ) -ENGINE = ReplicatedMergeTree( - '/clickhouse/tables/{shard}/bhabibullin/lesson_popularity_summary', - '{replica}' +ENGINE = ReplicatedAggregatingMergeTree( + '/clickhouse/tables/{shard}/bhabibullin/lesson_popularity_summary', + '{replica}' ) -ORDER BY (lesson_id, course_id); +ORDER BY (lesson_id, course_id) +SETTINGS index_granularity = 8192; -CREATE MATERIALIZED VIEW mv_lesson_popularity_summary +CREATE MATERIALIZED VIEW bhabibullin.mv_lesson_popularity_summary ON CLUSTER clickhouse_cluster TO bhabibullin.lesson_popularity_summary AS @@ -113,13 +116,13 @@ SELECT l.title AS lesson_title, flv.course_id AS course_id, c.title AS course_title, - count() AS total_views, - uniqExact(flv.user_id) AS unique_users, - min(flv.viewed_at) AS first_view, - max(flv.viewed_at) AS last_view + sumState(1) AS total_views, + uniqState(flv.user_id) AS unique_users, + minState(flv.viewed_at) AS first_view, + maxState(flv.viewed_at) AS last_view FROM core_fact_lesson_views AS flv -JOIN core_dim_lesson AS l ON flv.lesson_id = l.lesson_id -JOIN core_dim_course AS c ON flv.course_id = c.course_id +JOIN core_dim_lesson AS l ON flv.lesson_id = l.lesson_id +JOIN core_dim_course AS c ON flv.course_id = c.course_id GROUP BY flv.lesson_id, l.title, @@ -189,21 +192,24 @@ ORDER BY user_id; CREATE MATERIALIZED VIEW bhabibullin.mv_inactive_users_summary ON CLUSTER clickhouse_cluster -to bhabibullin.inactive_users_summary +TO bhabibullin.inactive_users_summary AS SELECT cdu.user_id, cdu.name, cdu.email, cdu.age, - 0 as enrollment_count, + countDistinct(flv.course_id) as enrollment_count, cdu.registration_date FROM core_dim_user cdu -WHERE (cdu.user_id, 1) NOT IN ( - SELECT user_id, 1 - FROM core_enrollments - GROUP BY user_id -); +LEFT ANTI JOIN core_fact_lesson_views flv + ON cdu.user_id = flv.user_id +GROUP BY + cdu.user_id, + cdu.name, + cdu.email, + cdu.age, + cdu.registration_date; INSERT INTO bhabibullin.inactive_users_summary SELECT diff --git a/bhabibullin/greenplum/pet_project_gp.sql b/bhabibullin/greenplum/pet_project_gp.sql index d4cacd5..062f11b 100644 --- a/bhabibullin/greenplum/pet_project_gp.sql +++ b/bhabibullin/greenplum/pet_project_gp.sql @@ -119,16 +119,14 @@ SELECT dl.title AS lesson_title, dc.course_id, dc.title AS course_title, - COUNT(flv.lesson_id) AS total_views, - COUNT(DISTINCT du.user_id) AS unique_users, + COUNT(*) 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 core.dim_lesson dl JOIN core.dim_course dc ON dc.course_id = dl.course_id JOIN core.fact_lesson_views flv ON flv.lesson_id = dl.lesson_id -JOIN core.dim_user du ON du.user_id = flv.user_id -GROUP BY dl.lesson_id, dl.title, dc.course_id, dc.title -ORDER BY dl.lesson_id; +GROUP BY dl.lesson_id, dl.title, dc.course_id, dc.title; /* @@ -155,12 +153,15 @@ SELECT du.name AS user_name, du.email, du.age, - COUNT(e.course_id) AS enrollments_count, + COUNT(DISTINCT e.course_id) AS enrollments_count, du.registration_date FROM core.dim_user du LEFT JOIN core.enrollments e ON e.user_id = du.user_id -LEFT JOIN core.fact_lesson_views flv ON flv.user_id = du.user_id -WHERE flv.user_id IS NULL +WHERE NOT EXISTS ( + SELECT 1 + FROM core.fact_lesson_views flv + WHERE flv.user_id = du.user_id +) GROUP BY du.user_id, du.name, du.email, du.age, du.registration_date; /* diff --git a/bhabibullin/postgre/postrge_pet_project.sql b/bhabibullin/postgre/postrge_pet_project.sql index fa642d2..b4e0b86 100644 --- a/bhabibullin/postgre/postrge_pet_project.sql +++ b/bhabibullin/postgre/postrge_pet_project.sql @@ -90,12 +90,10 @@ select count(distinct lv.lesson_id) as viewed_lessons_count, max(lv.viewed_at) as last_view, min(lv.viewed_at) as first_view, - round( - count(distinct lv.lesson_id) * 100.0 / al.cnt_lesson - ,2) || '%' as engagegement_rate + round(count(distinct lv.lesson_id) * 100.0 / NULLIF(al.cnt_lesson, 0), 4) as engagement_rate from users u join enrollments e on u.id = e.user_id -join lesson_views lv on lv.user_id = u.id +left join lesson_views lv on lv.user_id = u.id join available_lessons al on al.user_id = u.id group by u.id, u.name, al.cnt_lesson ); @@ -136,7 +134,7 @@ from join lessons l on c.id = l.course_id join enrollments e on e.course_id = c.id join view_cnt vc on vc.course_id = c.id - join lesson_views lv on lv.lesson_id = l.id + left join lesson_views lv on lv.lesson_id = l.id group by c.title, vc.cnt, c.id order by course_id ); @@ -162,8 +160,8 @@ select count(distinct c.id) as total_courses, count(distinct l.id) as total_lessons, count(distinct lv.user_id) as users_with_views, - round(count(distinct l.id) * 1.0 / count(distinct c.id), 2) as avg_lessons_per_course, - count(lv.lesson_id) * 1.0 / count(distinct l.id) as avg_lessons_per_lesson + round(count(distinct l.id) * 1.0 / NULLIF(count(distinct c.id), 0), 2) as avg_lessons_per_course, + count(lv.lesson_id) * 1.0 / NULLIF(count(distinct l.id), 0) as avg_lessons_per_lesson from users u left join lesson_views lv on lv.user_id = u.id left join lessons l on l.id = lv.lesson_id