MySQL平均每4行

时间:2011-08-09 14:29:56

标签: php mysql

我有一个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

3 个答案:

答案 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条记录。