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 (上面示例中的分数只是我需要的输出格式的占位符) 谢谢 如果我理解正

我想使用两个动作(A和B)对用户进行排名

随着时间的推移,这两个动作将线性地“释放”值

动作A:60%重量

动作B:40%重量

分数=总和[行动权重*1000000/(当前时间戳-行动时间戳)]

包含用户操作的MySQL表 得分最高的用户应该在排名的第一位

如何编写性能SQL查询来计算用户的分数

查询的输出应采用以下格式:

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