如何编写SQL查询以根据加权操作和时间衰减对用户进行排名?

时间:2018-05-06 03:56:23

标签: mysql sql mariadb

我想用 2个操作(A和B)对用户进行排名。

这两个行动都会松散"随着时间流逝线性地计算。

行动A :60%权重

行动B :40%重量

  

得分= SUM [动作权重* 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 :(得分:1)

如果我理解这一点,你只需要一个普通的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;

虽然不确定你的公式。这是一些非常小的数字。也许根据需要改变它。

答案 1 :(得分:1)

这样的事情:

   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