# Метрики страницы пользователя

**URL:** <https://meta.discourse.org/t/user-page-metrics/354906>\
**Category:** Data & reporting\
**Tags:** sql-query\
**Created:** [31.Октябрь.2024 00:52:40 UTC](https://meta.discourse.org/t/user-page-metrics/354906 "2024-10-31T00:52:40Z")\
**Posts on this page:** 1\
**Showing post:** 8

<div class="post-metadata">

**Author:** ![SaraDev](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/saradev/32/335139_2.png) [@SaraDev](https://meta.discourse.org/u/SaraDev)\
**Post date:** [27.Февраль.2025 23:14:40 UTC](https://meta.discourse.org/t/user-page-metrics/354906/8 "2025-02-27T23:14:40Z")

</div>

> [@srinivas.chilukuri](#):
>
> Является ли поле `user_metrics` из таблицы `user_stats` правильным источником для этой информации? Учитывая, что `user_stats` — это статичная таблица, суммирующая показатели пользователя с момента его регистрации в Discourse, она может не подходить для фильтрации метрик в определённом временном диапазоне (например, с даты начала по дату окончания).

Вы правы: таблица `user_stats` является статичной и суммирует показатели пользователя за всё время с момента его регистрации в Discourse.

Вместо этого для фильтрации метрик по дате, таких как `posts_read_count` и `days_visited`, следует использовать таблицу базы данных `user_visits` для данных о постах. Для фильтрации метрики `topics_entered` по дате также нужно использовать таблицу `topic_views`.

> [@srinivas.chilukuri](#):
>
> Для заданного набора пользователей мы сравнили доступные данные за определённый период на [странице пользователя](https://discourse.onlinedegree.iitm.ac.in/u?order=likes_received&period=monthly) и заметили существенные расхождения.

Расхождения, которые вы обнаружили, вызваны использованием таблицы `user_stats` вместо других таблиц, таких как `user_visits` и `topic_views`, для фильтрации этих статистических данных по дате.

Чтобы исправить это, мы можем обновить запрос, используя указанные таблицы базы данных:

Вот обновлённая версия запроса:

**Метрики на странице пользователя**

```sql
-- [params]
-- date :start_date = 2020-01-01
-- date :end_date = 2026-01-01

WITH likes_received AS (
    SELECT 
        ua.user_id AS user_id,
        COUNT(*) AS likes_received
    FROM 
        user_actions ua
    WHERE 
        ua.action_type = 2
        AND ua.created_at BETWEEN :start_date AND :end_date
    GROUP BY 
        ua.user_id
),
likes_given AS (
    SELECT 
        ua.acting_user_id AS user_id,
        COUNT(*) AS likes_given
    FROM 
        user_actions ua
    WHERE 
        ua.action_type = 1
        AND ua.created_at BETWEEN :start_date AND :end_date
    GROUP BY 
        ua.acting_user_id
),
user_metrics AS (
    SELECT 
        tv.user_id,
        COUNT(DISTINCT tv.topic_id) AS topics_viewed
    FROM 
        topic_views tv
    WHERE 
        tv.viewed_at BETWEEN :start_date AND :end_date
    GROUP BY 
        tv.user_id
),
days_and_posts AS (
    SELECT 
        uv.user_id,
        COUNT(DISTINCT uv.visited_at) AS days_visited,
        SUM(uv.posts_read) AS posts_read
    FROM 
        user_visits uv
    WHERE 
        uv.visited_at BETWEEN :start_date AND :end_date
    GROUP BY 
        uv.user_id
),
solutions AS (
    SELECT 
        ua.acting_user_id AS user_id,
        COUNT(*) AS solutions
    FROM 
        user_actions ua
    WHERE 
        ua.action_type = 15 
        AND ua.created_at BETWEEN :start_date AND :end_date
    GROUP BY 
        ua.acting_user_id
),
cheers AS (
    SELECT 
        gs.user_id,
        SUM(gs.score) AS cheers
    FROM 
        gamification_scores gs
    WHERE 
        gs.date BETWEEN :start_date AND :end_date
    GROUP BY 
        gs.user_id
)

SELECT 
    u.id AS user_id,
    COALESCE(lr.likes_received, 0) AS likes_received,
    COALESCE(lg.likes_given, 0) AS likes_given,
    COALESCE(um.topics_viewed, 0) AS topics_viewed,
    COALESCE(dp.days_visited, 0) AS days_visited,
    COALESCE(dp.posts_read, 0) AS posts_read,
    COALESCE(sol.solutions, 0) AS solutions,
    COALESCE(ch.cheers, 0) AS cheers
FROM 
    users u
LEFT JOIN 
    likes_received lr ON u.id = lr.user_id
LEFT JOIN 
    likes_given lg ON u.id = lg.user_id
LEFT JOIN 
    user_metrics um ON u.id = um.user_id
LEFT JOIN 
    days_and_posts dp ON u.id = dp.user_id
LEFT JOIN 
    solutions sol ON u.id = sol.user_id
LEFT JOIN 
    cheers ch ON u.id = ch.user_id
ORDER BY 
    u.id

```

Обратите внимание, что при использовании этого метода данные о прочитанных постах (`posts_read`) в таблице `user_visits` имеют одно важное отличие: они не учитывают собственные посты пользователя, тогда как данные из таблицы `user_stats` включают и посты, написанные самим пользователем. Поэтому вы всё ещё можете заметить расхождения между этими двумя показателями в данном запросе и на странице пользователя.

---

_[View the full topic](https://meta.discourse.org/t/user-page-metrics/354906)._
