Files
homework/skonev/postgresql/dm_user_activity_summary.sql
T
2025-12-19 11:39:12 +03:00

38 lines
841 B
PL/PgSQL

BEGIN;
CREATE MATERIALIZED VIEW user_activity_summary AS
WITH users_views AS (
SELECT
u.id AS user_id,
u.name,
COUNT(DISTINCT lv.lesson_id) AS viewed_lessons_count,
MAX(lv.viewed_at) AS last_view,
MIN(lv.viewed_at) AS first_view
FROM users AS u
JOIN lesson_views AS lv on u.id = lv.user_id
GROUP BY u.id
),
users_engagement AS (
SELECT
e.user_id AS user_id,
COUNT(DISTINCT l.id) AS lessons_cnt,
COUNT(DISTINCT course_id) AS enrollment_count
FROM enrollments AS e
JOIN lessons AS l using(course_id)
GROUP BY e.user_id
)
SELECT
uv.user_id,
uv.name,
ue.enrollment_count,
uv.viewed_lessons_count,
uv.last_view,
uv.first_view,
ROUND(uv.viewed_lessons_count::DECIMAL / NULLIF(ue.lessons_cnt, 0) * 100, 2) AS engagement_rate
FROM users_views AS uv
LEFT JOIN users_engagement AS ue using (user_id)
ORDER BY uv.user_id
COMMIT;