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

标签 mysql case

我有一张这样的 table

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

points 是点数。 点数变化是自上次插入以来点数的变化

如何找到给定日期范围内波动最大的用户?

我试过了

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) 为负数,它将把 point_change 的绝对值添加到最大点数。

例如,在上面的数据中,如果我要选择自 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 CASE 语句 - 查找字段的波动百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090084/

相关文章:

mysql - 用于按数字部分对字母数字字符串进行排序的 SQL

php - 将数据从一个 MySQL 表移动到另一个

Java switch 结构未读取 '\n'

SQL:即使不是全部都被执行,我怎样才能确保所有 SELECT Cases 都被表示出来?

mysql - 在 mySQL 中使用 SELECT CASE 评估列并返回三列作为结果

mysql - 根据匹配的列值插入值

mysql - 如何访问跨多个表的左联接中的列结果,并且该列出现两次

linux - ssh mysqldump 到远程 nas 存储,使用 cron 在 .sh 文件中存储命令

mysql - CASE WHEN column1 IS NULL THEN NULL ELSE column2 END

mysql - 多对多交叉表和一对一交叉表有什么区别