Как написать SQL-запрос для ранжирования пользователей на основе взвешенных действий и времени? - PullRequest
0 голосов
/ 06 мая 2018

Есть 2 действия (A и B), которые я хочу использовать для ранжирования пользователей.

Оба действия будут «терять» значение линейно с течением времени.

Действие A : 60% веса

Действие B : 40% веса

Счет = СУММА [Вес действия * 1000000 / (текущая метка времени - метка времени действия)]

Таблица MySQL с действиями пользователя

user_id | action | timestamp
1       | A      | 1524428013410
1       | B      | 1525431531237
2       | B      | 1525578131563

Пользователи с наибольшим количеством очков должны быть в топе рейтинга.

Как написать эффективный SQL-запрос для вычисления оценок пользователей?

Вывод запроса должен быть в следующем формате:

user_id | score
1       | 0.92830
2       | 0.76382

(оценки в приведенном выше примере являются только заполнителями для нужного мне формата вывода).

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Примерно так:

   SELECT
        user_id,
        sum( IF(a.`action` = 'a', 0.6, 0.4) * 1000 / TIMESTAMPDIFF(second, a.timestamp, now()) ),

    FROM actions a

    group by user_id
0 голосов
/ 06 мая 2018

Если я правильно понимаю, вам просто нужен обычный GROUP BY. Вы можете JOIN весов. Используйте ORDER BY для сортировки. Предполагая, что ваш стол называется action_user.

SELECT au.`user_id`,
       sum(a.`weight` / (current_timestamp() - au.`timestamp`)) `score`
       FROM `action_user` au
            INNER JOIN (SELECT 'A' `action`,
                               .6 `weight`
                        UNION ALL
                        SELECT 'B' `action`,
                               .4 `weight`) a
                       ON a.`action` = au.`action`
       GROUP BY au.`user_id`
       ORDER BY 2 DESC;

Не уверен насчет вашей формулы, хотя. Это очень маленькие цифры. Возможно, измените это по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...