2011-08-09 83 views
2

我有1000万+行的表看起来像这样:MySQL的平均每4行

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

id是否每四行更改一次? – Flinsch

+0

每四行?你想如何订购清单? ids是连续的吗? – nobody

+0

该id不会每四行更改一次。一步一步,我想获得一个单一的ID的所有记录。从这些记录中,我想平均每4行一个月。我的最终表格中将包含数据库中每个月每年的平均值。 time_read字段是一个unix时间戳。 – Chris

回答

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记录一个月。

+0

不是我想要的东西(每个月1个值,当月总共小时平均值(每4行1个)),但是我能够使其工作。 – Chris

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 -part关于第二个问题,因为我不不知道如何按日期过滤东西(我没有看到日期栏或其他东西)。因此,现在,这将计算sum的所有平均值value s按4分组。

+0

不幸的是,根据OP的最新评论,它看起来ID根本没有改变:(我认为他们正在寻找每4行按'time_read'排序 – hughes

+0

time_read字段是一个unix时间戳。 ^^你是正确的 – Chris

2

如果您不想依赖您的“id”列(它可能不是连续的),您可以创建自己的通过该变量组每4行,像这样:

SET @rank = 0; 
SELECT AVG(value), CEIL((@rank:[email protected]+1)/4) AS rank FROM "your_table" GROUP BY rank;