Mysql 如何编写SQL查询,根据加权操作和时间衰减对用户进行排名?
我想使用两个动作(A和B)对用户进行排名 随着时间的推移,这两个动作将线性地“释放”值 动作A:60%重量 动作B:40%重量 分数=总和[行动权重*1000000/(当前时间戳-行动时间戳)] 包含用户操作的MySQL表 得分最高的用户应该在排名的第一位 如何编写性能SQL查询来计算用户的分数 查询的输出应采用以下格式:Mysql 如何编写SQL查询,根据加权操作和时间衰减对用户进行排名?,mysql,sql,mariadb,Mysql,Sql,Mariadb,我想使用两个动作(A和B)对用户进行排名 随着时间的推移,这两个动作将线性地“释放”值 动作A:60%重量 动作B:40%重量 分数=总和[行动权重*1000000/(当前时间戳-行动时间戳)] 包含用户操作的MySQL表 得分最高的用户应该在排名的第一位 如何编写性能SQL查询来计算用户的分数 查询的输出应采用以下格式: user_id | score 1 | 0.92830 2 | 0.76382 (上面示例中的分数只是我需要的输出格式的占位符) 谢谢 如果我理解正
user_id | score
1 | 0.92830
2 | 0.76382
(上面示例中的分数只是我需要的输出格式的占位符)
谢谢 如果我理解正确,您只需要一个普通的
分组依据
。您可以加入权重。使用排序依据进行排序。假设您的表名为action\u 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;
但我不确定你的配方。这是一些非常小的数字。可能会根据需要进行更改。类似以下内容:
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
您使用的是哪种dbms?我使用的是MySQL。您有多少种不同的操作?它总是A或B?只有两个动作,A和B。不确定分界。效果很好!我更新了公式,增加了一个1000000
的乘数,使分数看起来更好。谢谢@太棒了!它工作正常+1为简洁起见@user2736880
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