我有一个相当大的表,它会定期更新新的数据,如下所示:
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)
)"
答案 0 :(得分:1)
你可以试试这个:
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。