63 lines
1.7 KiB
SQL
63 lines
1.7 KiB
SQL
--Активность пользователей
|
|
|
|
CREATE MATERIALIZED VIEW user_activity_summary AS
|
|
|
|
--CTE кол-во курсов на которые записан пользователь
|
|
WITH enrollment_count AS (
|
|
SELECT
|
|
pe.user_id,
|
|
COUNT(*) AS enrollment_count
|
|
FROM pet_enrollments pe
|
|
GROUP BY pe.user_id
|
|
),
|
|
--CTE просмотренные уникальные уроки пользователем (кол-во)
|
|
viewed_lessons_count AS (
|
|
SELECT
|
|
plv.user_id,
|
|
DENSE_RANK() OVER(
|
|
PARTITION BY plv.user_id
|
|
ORDER BY plv.lesson_id
|
|
) AS viewed_lessons_count
|
|
FROM pet_lesson_views plv
|
|
),
|
|
|
|
--CTE дата и время последнего просмотра урока
|
|
last_view AS (
|
|
SELECT
|
|
plv.user_id,
|
|
LAST_VALUE(plv.viewed_at) OVER (
|
|
PARTITION BY plv.user_id
|
|
ORDER BY plv.viewed_at
|
|
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
|
|
) AS last_view
|
|
FROM pet_lesson_views plv
|
|
),
|
|
|
|
--CTE дата и время первого просмотра урока
|
|
first_view AS (
|
|
SELECT
|
|
plv.user_id,
|
|
FIRST_VALUE(plv.viewed_at) OVER (
|
|
PARTITION BY plv.user_id
|
|
ORDER BY plv.viewed_at
|
|
) AS first_view
|
|
FROM pet_lesson_views plv
|
|
)
|
|
|
|
SELECT
|
|
pu.id AS user_id,
|
|
pu.name AS name,
|
|
ec.enrollment_count AS enrollment_count,
|
|
MAX(vlc.viewed_lessons_count) AS viewed_lessons_count,
|
|
last_view,
|
|
first_view,
|
|
ROUND(MAX(vlc.viewed_lessons_count * 100.0 / (SELECT COUNT(*) FROM pet_lessons pl)), 2) || '%' AS engagement_rate
|
|
|
|
FROM pet_users pu
|
|
LEFT JOIN enrollment_count ec ON pu.id = ec.user_id
|
|
LEFT JOIN viewed_lessons_count vlc ON pu.id = vlc.user_id
|
|
LEFT JOIN last_view lv ON pu.id = lv.user_id
|
|
LEFT JOIN first_view fv ON pu.id = fv.user_id
|
|
|
|
GROUP BY pu.id, ec.enrollment_count, last_view, first_view
|
|
ORDER BY pu.id; |