我想用 2个操作(A和B)对用户进行排名。
这两个行动都会松散"随着时间流逝线性地计算。
行动A :60%权重
行动B :40%重量
得分= SUM [动作权重* 1000000 /(当前时间戳 - 动作时间戳)]
user_id | action | timestamp
1 | A | 1524428013410
1 | B | 1525431531237
2 | B | 1525578131563
得分最高的用户应该位于排名的前列。
如何编写高性能的SQL查询来计算用户'分数?
查询的输出应采用以下格式:
user_id | score
1 | 0.92830
2 | 0.76382
(上例中的分数只是我需要的输出格式的占位符。)
谢谢!
答案 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