82 lines
2.1 KiB
SQL
82 lines
2.1 KiB
SQL
CREATE MATERIALIZED VIEW course_summary AS
|
|
|
|
--кол-во уникальных пользователей в рамках одного курса (ready)
|
|
WITH unique_users AS (
|
|
SELECT
|
|
pe.course_id,
|
|
COUNT(DISTINCT pe.user_id) AS unique_users
|
|
FROM pet_enrollments pe
|
|
GROUP BY pe.course_id
|
|
ORDER BY pe.course_id
|
|
),
|
|
|
|
--общее кол-во уроков
|
|
lesson_count AS (
|
|
SELECT
|
|
pl.course_id,
|
|
COUNT(*) AS lesson_count
|
|
FROM pet_lessons pl
|
|
GROUP BY pl.course_id
|
|
ORDER BY pl.course_id
|
|
|
|
),
|
|
|
|
--суммарное число просмотров уроков по курсу
|
|
total_views AS (
|
|
SELECT
|
|
pc.id,
|
|
COUNT(*) AS total_views
|
|
FROM pet_courses pc
|
|
JOIN pet_lessons pl ON pc.id = pl.course_id
|
|
JOIN pet_lesson_views plv ON pl.id = plv.lesson_id
|
|
GROUP BY pc.id
|
|
ORDER BY pc.id
|
|
|
|
),
|
|
|
|
--дата и время первого просмотра любого урока курса
|
|
first_viewed_at AS (
|
|
SELECT
|
|
pc.id,
|
|
FIRST_VALUE(plv.viewed_at) OVER (
|
|
PARTITION BY pc.id
|
|
ORDER BY plv.viewed_at
|
|
) AS first_viewed_at
|
|
FROM pet_courses pc
|
|
JOIN pet_lessons pl ON pc.id = pl.course_id
|
|
JOIN pet_lesson_views plv ON pl.id = plv.lesson_id
|
|
),
|
|
|
|
--дата и время последнего просмотра любого урока курса
|
|
last_viewed_at AS (
|
|
SELECT
|
|
pc.id,
|
|
LAST_VALUE(plv.viewed_at) OVER (
|
|
PARTITION BY pc.id
|
|
ORDER BY plv.viewed_at
|
|
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
|
|
) AS last_viewed_at
|
|
FROM pet_courses pc
|
|
JOIN pet_lessons pl ON pc.id = pl.course_id
|
|
JOIN pet_lesson_views plv ON pl.id = plv.lesson_id
|
|
)
|
|
|
|
SELECT
|
|
pc.id AS course_id,
|
|
pc.title AS course_title,
|
|
uu.unique_users,
|
|
lc.lesson_count,
|
|
tv.total_views,
|
|
ROUND(tv.total_views * 1.0 / uu.unique_users, 2) AS avg_views_per_user,
|
|
first_viewed_at,
|
|
last_viewed_at
|
|
|
|
FROM pet_courses pc
|
|
LEFT JOIN unique_users uu ON pc.id = uu.course_id
|
|
LEFT JOIN lesson_count lc ON lc.course_id = pc.id
|
|
LEFT JOIN total_views tv ON tv.id = pc.id
|
|
LEFT JOIN first_viewed_at fva ON fva.id = pc.id
|
|
LEFT JOIN last_viewed_at lva ON lva.id = pc.id
|
|
|
|
GROUP BY pc.id, uu.unique_users, lc.lesson_count, tv.total_views, first_viewed_at, last_viewed_at
|
|
ORDER BY course_id; |