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

pobjuy32  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(440)

我想使用两个动作(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

(上面例子中的分数只是我需要的输出格式的占位符)。
谢谢!

abithluo

abithluo1#

像这样:

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
xwbd5t1u

xwbd5t1u2#

如果我理解正确,你只需要一个普通的 GROUP BY . 你可以 JOIN 重量。使用 ORDER BY 排序。假设你的table 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;

但我不确定你的配方。这是一些非常小的数字。也许可以根据需要改变。

相关问题