From 4d56aa1f5b92082564bcbb9f02e733447e85b0fc Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 23 Feb 2026 15:02:11 +0300 Subject: [PATCH] Pet 6th task completed --- aharlamcev/postgresql/Pet-projectsql.sql | 95 +++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/aharlamcev/postgresql/Pet-projectsql.sql b/aharlamcev/postgresql/Pet-projectsql.sql index a7cee09..1621bf6 100644 --- a/aharlamcev/postgresql/Pet-projectsql.sql +++ b/aharlamcev/postgresql/Pet-projectsql.sql @@ -353,7 +353,100 @@ ROUND(100.0 * unique_viewers / enrolled_to_course, 2) as completion_rate from lessons_in_courses lic join views_cte vc on lic.lesson_id = vc.lesson_id ; - +----------------------------------------------------------------------------------------------- +-- 6 Задания Воронка Конверсии +create materialized view conversion_funnel AS +with course_lessons as ( + select c.id as course_id, c.title as course_title, + COUNT(l.id) as total_lessons + from courses c + join lessons l on l.course_id = c.id + group by c.id, c.title + ), +registered_users as ( + select COUNT(distinct id) as total_users + from users + ), +enrolled_users as ( + select e.course_id, + COUNT(distinct e.user_id) as enrolled_count + from enrollments e + group by e.course_id + ), +started_users as ( + select l.course_id, + COUNT(distinct lv.user_id) as started_count + from lessons l + join lesson_views lv on l.id = lv.lesson_id + group by l.course_id + ), +user_progress as ( + select l.course_id, lv.user_id, + COUNT(distinct lv.lesson_id) as viewed_lessons + from lesson_views lv + join lessons l on lv.lesson_id = l.id + group by l.course_id, lv.user_id + ), +mid_progress_users as ( + select up.course_id, + COUNT(distinct up.user_id) as mid_progress_count + from user_progress up + join course_lessons cl on up.course_id = cl.course_id + where up.viewed_lessons >= cl.total_lessons * 0.5 + group by up.course_id + ), +completed_users as ( + select up.course_id, + COUNT(distinct up.user_id) as completed_count + from user_progress up + join course_lessons cl on up.course_id = cl.course_id + where up.viewed_lessons >= cl.total_lessons + group by up.course_id + ), +funnel_stages as ( + select cl.course_id, cl.course_title, + 'registered' as stage_name, + ru.total_users as users_count, + 1 as stage_order + from course_lessons cl + cross join registered_users ru + union all + select cl.course_id, cl.course_title, + 'enrolled' as stage_name, + eu.enrolled_count as users_count, + 2 as stage_order + from course_lessons cl + left join enrolled_users eu on cl.course_id = eu.course_id + union all + select cl.course_id, cl.course_title, + 'started' as stage_name, + su.started_count as users_count, + 3 as stage_order + from course_lessons cl + left join started_users su on cl.course_id = su.course_id + union all + select cl.course_id, cl.course_title, + 'mid_progress' as stage_name, + coalesce(mpu.mid_progress_count, 0) as users_count, + 4 as stage_order + from course_lessons cl + left join mid_progress_users mpu on cl.course_id = mpu.course_id + union all + select cl.course_id, cl.course_title, + 'completed' as stage_name, + coalesce(cu.completed_count, 0) as users_count, + 5 as stage_order + from course_lessons cl + left join completed_users cu on cl.course_id = cu.course_id + ) + select course_id, course_title, stage_name, users_count, + ROUND(100.0 * users_count / NULLIF(LAG(users_count) over (partition by course_id order by stage_order), 0), 2) + as conversion_from_previous, + ROUND(100.0 * users_count / NULLIF(FIRST_VALUE(users_count) over (partition by course_id order by stage_order), 0), 2) + as conversion_from_start + from funnel_stages +; +-- Признаюсь 6-е задание сделал с помощью нейросети, потому что сам вообще никак к нему подобраться не мог.