Mysql CASE语句 - 查找字段的百分比波动

时间:2014-11-23 14:36:32

标签: mysql case

我有一张这样的表

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%

1 个答案:

答案 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;