2014-11-23 56 views
0

的波動百分比我有這樣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%

+0

請提供樣本數據和你所說的「最波動點」是什麼的描述。我可以想出幾種方法來衡量這個概念。 – 2014-11-23 14:40:46

+0

@GordonLinoff我添加了一些數據 – user813801 2014-11-23 14:46:19

回答

1

「波動」的典型統計指標是方差或標準偏差。你可以在MySQL中使用variance()std()直接計算這些:

 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; 
+0

謝謝戈登。我添加了一些數據以使其更清晰。 – user813801 2014-11-23 14:53:06

+0

@ user813801。 。 。標準差似乎是一個合理的措施。 – 2014-11-23 15:08:08