2011-07-11 20 views
1

我目前被困試圖讓使用MySQL n行的組的平均值得到N個行組的平均水平。與MySQL

我有一個MySQL表以下列格式列組成(data_conso): ID(INT);日期(日期時間);數據(INT)

我想(爲了使一個很好的圖形,沒有太多分),由假設100,然後讓每個組的平均值的組所有這些值拆分。

帶着幾分搜索和修修補補的,我設法編寫以下查詢:

SET @i := 0; 
SELECT 
    @i:[email protected]+1 as rownum, 
    FLOOR(@i/100) AS `datagrp`, 
    AVG(`tmptbl`.`data`) 
FROM (
    SELECT `data` 
    FROM data_conso ORDER BY `date` ASC 
) as `tmptbl` 
GROUP BY `datagrp` 

這在理論上會工作(或至少我不知道爲什麼它不會),但只有回報一個值!非常奇怪的是,如果我移除了圍繞tmptbl的AVG()函數。 data,它應該返回每個組,只是沒有平均值。

我不明白的是爲什麼AVG(),這是一個聚合函數,不使用GROUP BY,以使其計算。

我真的被這個問題,任何形式的幫助受挫真的可以理解。 原諒我的英語,並提前感謝您的回答!

回答

3
SET @i := 0; 
SELECT AVG(`date`), AVG(`data`) 
FROM 
(
    SELECT 
     @i:[email protected]+1 as rownum, 
     FLOOR(@i/100) AS `datagrp`, 
     `date`, 
     `data` 
    FROM data_conso 
    ORDER BY `date` ASC 
) 
GROUP BY `datagrp`; 

類似的東西應該工作的變量,想法是將datagrp列附加到您的原始表格,然後只選擇每個datagrp的平均值。

+0

但是,您也可以按時間段進行分組,即「SELECT AVG(日期),AVG(數據)FROM data_conso GROUP BY CEIL((日期)/ 3600)'以獲得小時平均值。 – tera

+0

非常感謝,這爲我工作。似乎madflow是對的,我的@i是一個問題。我還將它初始化爲-1,以便有100行的組(如果沒有的話,它只能組99個)。我會在幾天內使用你的日期分組的想法,我會讓你張貼! – Aweb

0

嘗試改變GROUP BY datagrp到GROUP BY tmptbldata

SET @i := 0; 
SELECT 
    @i:[email protected]+1 as rownum, 
    FLOOR(@i/100) AS `datagrp`, 
    AVG(`tmptbl`.`data`) 
FROM (
    SELECT `data` 
    FROM data_conso ORDER BY `date` ASC 
) as `tmptbl` 
GROUP BY `tmptbl`.`data` 
+0

首先,讓我感謝您的快速回答。 問題是GROUP BY'datagrp'允許我創建100行的組,這是我爲了使它們的平均值所需要的。 – Aweb

0

只是一個猜測。如果你嘗試什麼:

SET @i := 0; 
SELECT 
    floor((@i := @i + 1)/100) AS `datagrp`, 
    AVG(`tmptbl`.`data`) 
FROM (
    SELECT `data` 
    FROM data_conso ORDER BY `date` ASC 
) as `tmptbl` 
GROUP BY `datagrp` 
0

此文檔聽起來像你的問題。

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

在SELECT語句中,每個選擇表達僅當 發送到客戶端評估。這意味着,在HAVING,GROUP BY或ORDER BY 條款,指的是在選擇 表達式列表分配一個值不按預期

+0

我想你可能是在正確的方式,看到tera的查詢爲我工作。謝謝! – Aweb