我有一张这样的表
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点。
所以例如,在上面的数据中,如果我从2014-10-15开始选择数据,则会给出用户ID 6,更改为-70/20 = 315%而不是-70 /(20 + 70) )= 77%
答案 0 :(得分:1)
“波动”的典型统计量度是方差或标准差。您可以使用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;