Este informe SQL proporciona un recuento diario de lectores (usuarios que solo leen publicaciones) y usuarios activos (usuarios que han creado al menos una publicación durante el día), durante un rango de fechas especificado, con un filtro opcional para el ID de categoría.
Este informe está diseñado para ayudar a los administradores a comprender cuán activa está su comunidad, no solo en términos de creación de contenido sino también en consumo de contenido. Esta doble perspectiva permite una comprensión más detallada de la participación del usuario, destacando los días con alta actividad de lectura o publicación.
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2024-02-01
-- int :reader_post_read_count = 10
-- null int :category_id
WITH posts_by_user AS (
SELECT
p.user_id,
p.created_at::date AS post_date,
p.topic_id,
COUNT(*) AS posts
FROM posts p
WHERE p.created_at::date BETWEEN :start_date AND :end_date
GROUP BY p.user_id, post_date, p.topic_id
),
posts_read_by_user AS (
SELECT
uv.user_id,
uv.visited_at::date AS visit_date,
SUM(uv.posts_read) AS posts_read
FROM user_visits uv
LEFT JOIN group_users gu ON gu.user_id = uv.user_id
LEFT JOIN groups g ON g.id = gu.group_id
LEFT JOIN posts p ON p.user_id = uv.user_id AND p.created_at BETWEEN :start_date AND :end_date
LEFT JOIN topics t ON t.id = p.topic_id AND t.category_id = :category_id
WHERE uv.visited_at BETWEEN :start_date AND :end_date
AND (:category_id IS NULL OR t.category_id IS NOT NULL)
GROUP BY uv.user_id, visit_date
),
active_users_per_day AS (
SELECT
pbu.post_date,
COUNT(DISTINCT pbu.user_id) AS active_user_count
FROM posts_by_user pbu
JOIN topics t ON pbu.topic_id = t.id
WHERE posts > 0
AND (:category_id IS NULL OR t.category_id = :category_id)
GROUP BY post_date
),
readers_per_day AS (
SELECT
prbu.visit_date,
COUNT(DISTINCT prbu.user_id) AS reader_count
FROM posts_read_by_user prbu
LEFT JOIN posts_by_user pbu ON prbu.user_id = pbu.user_id AND prbu.visit_date = pbu.post_date
WHERE pbu.posts IS NULL
AND prbu.posts_read > :reader_post_read_count
GROUP BY prbu.visit_date
)
SELECT
rpd.visit_date,
rpd.reader_count,
COALESCE(aupd.active_user_count, 0) AS active_user_count
FROM readers_per_day rpd
LEFT JOIN active_users_per_day aupd ON rpd.visit_date = aupd.post_date
ORDER BY rpd.visit_date
Explicación de la consulta SQL
Parámetros
start_dateyend_date: Definen el marco de tiempo para el análisis.reader_post_read_count: Establece el umbral para considerar a alguien como “lector” según la cantidad de publicaciones que ha leído.category_id: Opcional. Cuando se especifica, el informe se centra en una sola categoría, lo que permite un análisis más específico.
CTEs
- posts_by_user: Esta CTE identifica la cantidad de publicaciones creadas por cada usuario en cada día dentro del rango de fechas especificado. Es crucial para comprender qué usuarios contribuyen con contenido y cómo se distribuye esta actividad a lo largo del tiempo.
- posts_read_by_user: Esta CTE calcula la cantidad de publicaciones leídas por cada usuario en cada día, también dentro del rango de fechas especificado. Utiliza datos de visitas de usuarios para estimar el consumo de contenido, un indicador clave de participación.
- active_users_per_day: Basada en la CTE
posts_by_user, esta CTE cuenta la cantidad de usuarios únicos que publicaron al menos una vez al día. Proporciona una instantánea diaria de los creadores de contenido activos. - readers_per_day: Utilizando la CTE
posts_read_by_user, esta CTE identifica a los usuarios que leyeron más que un número especificado de publicaciones (reader_post_read_count) sin publicar ellos mismos. Destaca a la mayoría silenciosa que participa leyendo.
Resultados
La salida final presenta una descripción general diaria de la participación del usuario, detallando la cantidad de lectores y usuarios activos (aquellos que publicaron) cada día.
Resultados de ejemplo
| visit_date | reader_count | active_user_count |
|---|---|---|
| 2024-01-02 | 150 | 25 |
| 2024-01-03 | 175 | 30 |
| 2024-01-04 | 160 | 20 |
| 2024-01-05 | 180 | 22 |
| … | … | … |