簡體   English   中英

MySQL平均每4行

[英]MySQL Average Every 4 Rows

我有一個超過一千萬的行表,看起來像這樣:

    id | time_read  | value
    -----------------------
    9   1111111111   100
    9   1111111222   200
    9   1111111333   150
    9   1111111444   225

我想對每4行AVG值。 如何在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

我不知道您是否故意這樣做,但我認為這只是一個拼寫錯誤:您的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由4分組秒。

如果您不想依賴“ id”列(它可能不是順序的),則可以創建自己的變量來按每4行更改一次,例如:

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

試試這個代碼-

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條記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM