sql - Mysql选择行之间的最大差异

标签 sql mysql

我有一个相当大的表,该表会定期更新新数据,如下所示:

id  |  name  |  c1  |  c2  |  c3  |  c4  |  time
-------------------------------------------------
 1  |  miley |  23  |  11  |  21  |  18  |  2013-01-13 20:26:25
 2  |  john  |  31  |  29  |  23  |  27  |  2013-01-13 20:26:25
 3  |  steve |  44  |  31  |  33  |  35  |  2013-01-13 20:26:25
 4  |  miley |  34  |  44  |  47  |  48  |  2013-01-14 08:26:25
 5  |  john  |  27  |  53  |  49  |  52  |  2013-01-14 08:26:25
 6  |  steve |  27  |  62  |  50  |  64  |  2013-01-14 08:26:25
 7  |  miley |  44  |  54  |  57  |  87  |  2013-01-14 20:26:25
 8  |  john  |  37  |  93  |  59  |  62  |  2013-01-14 20:26:25
 9  |  steve |  85  |  71  |  87  |  74  |  2013-01-14 20:26:25
...etc

我需要一个查询来找出每天每一列的差异最大的人。 (例如,在 14 日 - 史蒂夫的 c1 和 c3 增幅最大,约翰有 c2,麦莉有 c4)。每个人的人数总是在增加,因此可以假设任何人在任何一天的第一个条目总是小于他们当天的最后一个条目。

我已经尝试解决了一些问题,但收效甚微,而且没有太多进展,是否有人至少可以指出我正确的方向?

理想情况下,理想的输出是每行的数组,其中包含增幅最大的名称和差异。我不确定所有这些都可以在一个查询中完成,但我真正需要的是每一列增加最多的人的名字以及他们的区别是什么。

.

分割

我需要在 14 日为每个人获取第一个和最后一个条目(id:4 到 9);比较他们的c1值的差异,返回差异最大的人的名字。对 c2、c3 和 c4 重复。


到目前为止,感谢 orangecrush,我只尝试获取 1 列:(错误:组函数的无效使用)

        "SELECT nm, diff_c1 FROM (
         SELECT NAME nm, MAX(c1) - MIN(c1) DIFF_C1 FROM TABLE AS a
             WHERE `time` > DATE_SUB(now(), INTERVAL 1 DAY)
             GROUP BY NAME) AS c 
         WHERE diff_c1 = (
         (SELECT max(MAX(c1) - MIN(c1)) FROM TABLE AS b 
         WHERE `time` > DATE_SUB(now(), INTERVAL 1 DAY) GROUP BY NAME)
         )"

最佳答案

你可以试试这个:

SELECT nm, 'c1', diff_c1
  FROM (SELECT NAME nm, MAX(C1) - MIN(C1) DIFF_C1
          FROM TEST
         WHERE trunc(TIME) = '14-JAN-2013'
         GROUP BY NAME)
 WHERE diff_c1 = ((SELECT max(MAX(C1) - MIN(C1))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))
union
SELECT nm, 'c2', diff_c2
  FROM (SELECT NAME nm, MAX(C2) - MIN(C2) DIFF_C2
          FROM TEST
         WHERE trunc(TIME) = '14-JaN-2013'
         GROUP BY NAME)
 WHERE diff_c2 = ((SELECT max(MAX(C2) - MIN(C2))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))
union
SELECT nm, 'c3', diff_c3
  FROM (SELECT NAME nm, MAX(C3) - MIN(C3) DIFF_C3
          FROM TEST
         WHERE trunc(TIME) = '14-JaN-2013'
         GROUP BY NAME)
 WHERE diff_c3 = ((SELECT max(MAX(C3) - MIN(C3))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))
union
SELECT nm, 'c4', diff_c4
  FROM (SELECT NAME nm, MAX(C4) - MIN(C4) DIFF_C4
          FROM TEST
         WHERE trunc(TIME) = '14-JaN-2013'
         GROUP BY NAME)
 WHERE diff_c4 = ((SELECT max(MAX(C4) - MIN(C4))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))

对日期进行硬编码。如果发现此查询有效,则稍后可以动态调用它。我用于测试的表名:TEST。

关于sql - Mysql选择行之间的最大差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14331759/

相关文章:

c# - 在 Sql Server Session 数据库中存储多个值的有效方法是什么?

PHP MYSQL INSERT 不再有效

mysql - 如何获取mysql中最后更新的行的值?

java - Android 中的 Activity 启动时如何显示所有数据库记录?

尝试截断表时出现 MySQL 错误

具有数组键的 PHP MySQL mysql_fetch_assoc 以 'as' 名称区分

mysql - 合并 DBGrid 列值

mysql - 我的 SQL 文件有什么问题?

sql - 当与每条信息关联的标签数量可变时,在关系数据库中存储标签的好方法

sql - 没有数据时删除空假脱机文件