我有一个1000万+行表,看起来像这样:
id | time_read | value
-----------------------
9 1111111111 100
9 1111111222 200
9 1111111333 150
9 1111111444 225
我想AVG每4行的值。我如何在MySQL中执行此操作?
另外,在我的问题中,如果我想在一个月内为每一行数据平均每4行的值并在表格中返回每年每月的总数,我该如何做?例如,在我的第一个问题中使用相同的表格,最后是:
2008 | 12 | 500000
2009 | 01 | 450000
2009 | 02 | 475000
编辑:换句话说,每个平均4行的总数按年 - 月分组。每次time_read相隔15分钟。
我之前做过类似的事,但不够准确。我需要平均每4行和总数,而不是在一个月内取所有值的总和除以4。
SELECT DATE_FORMAT(FROM_UNIXTIME(time_read),'%Y %m') as tr,
DATE_FORMAT(FROM_UNIXTIME(time_read),'%Y') as year,
DATE_FORMAT(FROM_UNIXTIME(time_read),'%m') as month, SUM(value) as value
FROM table WHERE id = 9
GROUP BY tr
答案 0 :(得分:2)
我不知道你是否故意这样做,但我认为这只是一个小错字:你的每行ID是9。 如果是,您可能正在寻找此查询:
SELECT AVG(value) AS val, CEIL(id / 4) AS group_id FROM table GROUP BY group_id
第二个问题:
SELECT SUM(val) FROM (SELECT AVG(value) AS val, CEIL(id / 4) AS group_id FROM table GROUP BY group_id) AS fred
此时我无法为第二个问题提供where
部分,因为我不知道你是如何按日期过滤事物的(我没有看到日期列或其他内容)。因此,目前,这将计算归类为4的所有平均sum
的{{1}}。
答案 1 :(得分:2)
如果你不想依赖你的“id”列(它可能不是顺序的),你可以创建自己的变量来进行分组,每4行更改一次,如下所示:
SET @rank = 0;
SELECT AVG(value), CEIL((@rank:=@rank+1)/4) AS rank FROM "your_table" GROUP BY rank;
答案 2 :(得分:0)
试试这段代码 -
CREATE TABLE table1 (
id INT(11) NOT NULL AUTO_INCREMENT,
time_read INT(11) DEFAULT NULL,
value INT(11) DEFAULT NULL,
PRIMARY KEY (id)
);
INSERT INTO table1 VALUES
(1, 1312880400, 10), -- 09.08.2011 12:00:00 -> 1 august
(2, 1312880410, 20), -- 09.08.2011 12:00:10 -> 2
(3, 1312880420, 30), -- 09.08.2011 12:00:20 -> 3
(4, 1312880430, 40), -- 09.08.2011 12:00:30 -> 4
(5, 1312880440, 50), -- 09.08.2011 12:00:40 -> 5
(6, 1315558800, 60), -- 09.09.2011 12:00:00 -> 1 september
(7, 1315558810, 70); -- 09.09.2011 12:00:10 -> 2
SELECT AVG(value) FROM (
SELECT t1.*, COUNT(*) cnt FROM table1 t1
LEFT JOIN table1 t2
ON t2.time_read <= t1.time_read
AND YEAR(FROM_UNIXTIME(t2.time_read)) = YEAR(FROM_UNIXTIME(t1.time_read))
AND MONTH(FROM_UNIXTIME(t2.time_read)) = MONTH(FROM_UNIXTIME(t1.time_read))
GROUP
BY time_read
) t
GROUP BY
YEAR(FROM_UNIXTIME(time_read)), MONTH(FROM_UNIXTIME(time_read)), CEIL(cnt/4);
+------------+
| AVG(value) |
+------------+
| 25.0000 |
| 50.0000 |
| 65.0000 |
+------------+
它按月分组,每月记录4条记录。