我有一张这样的 table
id userid points points_change date
1 6 100 0 2014-10-1
2 6 90 -10 2014-10-11
3 6 20 -70 2014-10-15
4 5 50 0 2014-10-16
points 是点数。 点数变化是自上次插入以来点数的变化
如何找到给定日期范围内波动最大的用户?
我试过了
SELECT `userid`, ABS(((SUM(`points_change`))/MAX(`points`))) AS f
FROM `mytable`
WHERE `date` BETWEEN $last AND $now
GROUP BY `userid`
HAVING f > 0
ORDER BY f DESC LIMIT 10
这里的问题是,当 SUM(points_change) 为负数时,您可能会出现 > 100% 的波动,这是不应该发生的。
是否有一种方法可以执行某种 case 语句,以便如果 SUM(points_change) 为负数,它将把 point_change 的绝对值添加到最大点数。
例如,在上面的数据中,如果我要选择自 2014 年 10 月 15 日以来的数据,它将为用户 ID 6 提供 -70/20 = 315% 的变化,而不是 -70/(20+70 )=77%
最佳答案
“波动”的典型统计度量是方差或标准差。您可以使用 variance()
和 std()
在 MySQL 中直接计算这些:
SELECT userid, std(points_change) as std_points_change
FROM `mytable`
WHERE `date` BETWEEN $last AND $now
GROUP BY `userid`
ORDER BY std_points_change DESC
LIMIT 10;
关于Mysql CASE 语句 - 查找字段的波动百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090084/