我有一个相当大的表,该表会定期更新新数据,如下所示:
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/