Исправился по всем замечаниям

This commit is contained in:
Batirbulat
2025-12-31 17:51:04 +03:00
parent e7f7bb8dc6
commit 3297ddb2b5
3 changed files with 42 additions and 37 deletions
+28 -22
View File
@@ -86,6 +86,8 @@ ORDER BY (lesson_id, course_id);
- Дата первого и последнего просмотра - Дата первого и последнего просмотра
*/ */
-- Основная таблица с AggregatingMergeTree
CREATE TABLE bhabibullin.lesson_popularity_summary CREATE TABLE bhabibullin.lesson_popularity_summary
ON CLUSTER clickhouse_cluster ON CLUSTER clickhouse_cluster
( (
@@ -93,18 +95,19 @@ ON CLUSTER clickhouse_cluster
lesson_title String, lesson_title String,
course_id UInt32, course_id UInt32,
course_title String, course_title String,
total_views UInt32, total_views AggregateFunction(sum, UInt64),
unique_users UInt32, unique_users AggregateFunction(uniq, UInt32),
first_view DateTime64(3, 'UTC'), first_view AggregateFunction(min, DateTime64(3, 'UTC')),
last_view DateTime64(3, 'UTC') last_view AggregateFunction(max, DateTime64(3, 'UTC'))
) )
ENGINE = ReplicatedMergeTree( ENGINE = ReplicatedAggregatingMergeTree(
'/clickhouse/tables/{shard}/bhabibullin/lesson_popularity_summary', '/clickhouse/tables/{shard}/bhabibullin/lesson_popularity_summary',
'{replica}' '{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 ON CLUSTER clickhouse_cluster
TO bhabibullin.lesson_popularity_summary TO bhabibullin.lesson_popularity_summary
AS AS
@@ -113,13 +116,13 @@ SELECT
l.title AS lesson_title, l.title AS lesson_title,
flv.course_id AS course_id, flv.course_id AS course_id,
c.title AS course_title, c.title AS course_title,
count() AS total_views, sumState(1) AS total_views,
uniqExact(flv.user_id) AS unique_users, uniqState(flv.user_id) AS unique_users,
min(flv.viewed_at) AS first_view, minState(flv.viewed_at) AS first_view,
max(flv.viewed_at) AS last_view maxState(flv.viewed_at) AS last_view
FROM core_fact_lesson_views AS flv FROM core_fact_lesson_views AS flv
JOIN core_dim_lesson AS l ON flv.lesson_id = l.lesson_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 JOIN core_dim_course AS c ON flv.course_id = c.course_id
GROUP BY GROUP BY
flv.lesson_id, flv.lesson_id,
l.title, l.title,
@@ -189,21 +192,24 @@ ORDER BY user_id;
CREATE MATERIALIZED VIEW bhabibullin.mv_inactive_users_summary CREATE MATERIALIZED VIEW bhabibullin.mv_inactive_users_summary
ON CLUSTER clickhouse_cluster ON CLUSTER clickhouse_cluster
to bhabibullin.inactive_users_summary TO bhabibullin.inactive_users_summary
AS AS
SELECT SELECT
cdu.user_id, cdu.user_id,
cdu.name, cdu.name,
cdu.email, cdu.email,
cdu.age, cdu.age,
0 as enrollment_count, countDistinct(flv.course_id) as enrollment_count,
cdu.registration_date cdu.registration_date
FROM core_dim_user cdu FROM core_dim_user cdu
WHERE (cdu.user_id, 1) NOT IN ( LEFT ANTI JOIN core_fact_lesson_views flv
SELECT user_id, 1 ON cdu.user_id = flv.user_id
FROM core_enrollments GROUP BY
GROUP BY user_id cdu.user_id,
); cdu.name,
cdu.email,
cdu.age,
cdu.registration_date;
INSERT INTO bhabibullin.inactive_users_summary INSERT INTO bhabibullin.inactive_users_summary
SELECT SELECT
+9 -8
View File
@@ -119,16 +119,14 @@ SELECT
dl.title AS lesson_title, dl.title AS lesson_title,
dc.course_id, dc.course_id,
dc.title AS course_title, dc.title AS course_title,
COUNT(flv.lesson_id) AS total_views, COUNT(*) AS total_views,
COUNT(DISTINCT du.user_id) AS unique_users, COUNT(DISTINCT flv.user_id) AS unique_users,
MIN(flv.viewed_at) AS first_view, MIN(flv.viewed_at) AS first_view,
MAX(flv.viewed_at) AS last_view MAX(flv.viewed_at) AS last_view
FROM core.dim_lesson dl FROM core.dim_lesson dl
JOIN core.dim_course dc ON dc.course_id = dl.course_id 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.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;
GROUP BY dl.lesson_id, dl.title, dc.course_id, dc.title
ORDER BY dl.lesson_id;
/* /*
@@ -155,12 +153,15 @@ SELECT
du.name AS user_name, du.name AS user_name,
du.email, du.email,
du.age, du.age,
COUNT(e.course_id) AS enrollments_count, COUNT(DISTINCT e.course_id) AS enrollments_count,
du.registration_date du.registration_date
FROM core.dim_user du FROM core.dim_user du
LEFT JOIN core.enrollments e ON e.user_id = du.user_id 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 NOT EXISTS (
WHERE flv.user_id IS NULL 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; GROUP BY du.user_id, du.name, du.email, du.age, du.registration_date;
/* /*
+5 -7
View File
@@ -90,12 +90,10 @@ select
count(distinct lv.lesson_id) as viewed_lessons_count, count(distinct lv.lesson_id) as viewed_lessons_count,
max(lv.viewed_at) as last_view, max(lv.viewed_at) as last_view,
min(lv.viewed_at) as first_view, min(lv.viewed_at) as first_view,
round( round(count(distinct lv.lesson_id) * 100.0 / NULLIF(al.cnt_lesson, 0), 4) as engagement_rate
count(distinct lv.lesson_id) * 100.0 / al.cnt_lesson
,2) || '%' as engagegement_rate
from users u from users u
join enrollments e on u.id = e.user_id 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 join available_lessons al on al.user_id = u.id
group by u.id, u.name, al.cnt_lesson group by u.id, u.name, al.cnt_lesson
); );
@@ -136,7 +134,7 @@ from
join lessons l on c.id = l.course_id join lessons l on c.id = l.course_id
join enrollments e on e.course_id = c.id join enrollments e on e.course_id = c.id
join view_cnt vc on vc.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 group by c.title, vc.cnt, c.id
order by course_id order by course_id
); );
@@ -162,8 +160,8 @@ select
count(distinct c.id) as total_courses, count(distinct c.id) as total_courses,
count(distinct l.id) as total_lessons, count(distinct l.id) as total_lessons,
count(distinct lv.user_id) as users_with_views, 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, 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 / count(distinct l.id) as avg_lessons_per_lesson count(lv.lesson_id) * 1.0 / NULLIF(count(distinct l.id), 0) as avg_lessons_per_lesson
from users u from users u
left join lesson_views lv on lv.user_id = u.id left join lesson_views lv on lv.user_id = u.id
left join lessons l on l.id = lv.lesson_id left join lessons l on l.id = lv.lesson_id