mysql - 如何编写 SQL 查询根据加权操作和时间衰减对用户进行排名?
问题描述
我想使用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
(上面例子中的分数只是我需要的输出格式的占位符)。
谢谢!
解决方案
如果我没听错的话,你只需要一个普通的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;
不过不确定你的公式。那是一些非常小的数字。也许根据需要改变它。
推荐阅读
- python - Python:如何添加特定字符作为将列表转换为字符串以区分列表中的最后一项?
- javascript - 引导表单电子邮件、范围和按钮被“禁用”,但为什么呢?
- python - 文本文件变成了一些乱七八糟的语言
- python - 从弹性搜索supervisord文件中获取端口号
- python - 如何从 matplotlib 中的另一个散点图中复制散点图大小比例?
- prolog - 要转换列表,Prolog
- excel - 搜索整个工作簿 VBA
- flutter - 使用 Flutter intl 扩展在 Flutter 中组织 .arb 文件
- c - 在C中检查数字是否是阿姆斯壮数
- python - Python在矩阵动态规划中找到最大的正方形