我有这样的桌子
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
点是点数。
点数变化是自上次插入以来的点数变化
如何找到给定日期范围内波动最大的用户?
我试过了
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)为负,则它将points_change的绝对值添加到Max points。
因此,例如,在上述数据中,如果我要选择自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 - Mysql CASE语句-查找字段的波动百分比,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27090084/