我有这样的桌子

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/

10-11 03:21