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

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
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
+9 -8
View File
@@ -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;
/*
+5 -7
View File
@@ -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