Получить среднее по группам из n строк с MySQL - PullRequest
1 голос
/ 11 июля 2011

В настоящее время я застрял, пытаясь получить среднее значение групп из n строк, используя MySQL.

У меня есть таблица MySQL (data_conso), состоящая из столбцов в следующем формате: id (int); Дата (даты и времени); данные (INT)

Я бы хотел (чтобы получить хороший график без слишком большого количества точек), чтобы разделить все эти значения на группы, скажем, 100, а затем получить среднее значение для каждой из этих групп.

Немного поиска и ковыряния мне удалось написать следующий запрос:

SET @i := 0;
SELECT
    @i:=@i+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`

Что в теории сработает (или, по крайней мере, я не знаю, почему это не сработает), но возвращает только одно значение! Что очень странно, если я удаляю функцию AVG () около tmptbl. data, она возвращает каждую группу так, как должна, только без усредненного значения.

Чего я не понимаю, так это того, почему AVG (), являющаяся агрегатной функцией, не использует GROUP BY для выполнения своих расчетов.

Я действительно разочарован этой проблемой, и любая помощь будет очень признательна. Прости меня за мой английский и заранее спасибо за ответ!

Ответы [ 4 ]

3 голосов
/ 11 июля 2011
SET @i := 0;
SELECT AVG(`date`), AVG(`data`)
FROM
(
    SELECT
        @i:=@i+1 as rownum,
        FLOOR(@i/100) AS `datagrp`,
        `date`,
        `data`
    FROM data_conso
    ORDER BY `date` ASC
)
GROUP BY `datagrp`;

Что-то подобное должно работать, идея состоит в том, чтобы добавить столбец datagrp к исходной таблице, а затем просто выбрать среднее значение для каждого datagrp.

0 голосов
/ 11 июля 2011

Просто предположение.Что если вы попробуете:

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 голосов
/ 11 июля 2011

Этот документ звучит как ваша проблема.

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

В операторе SELECT каждое выражение выбора оценивается только тогда, когда отправлено клиенту. Это означает, что в HAVING, GROUP BY или ORDER BY предложение, ссылаясь на переменную, которой присвоено значение в select список выражений не работает должным образом

0 голосов
/ 11 июля 2011

Попробуйте изменить GROUP BY datagrp на GROUP BY tmptbl. data

SET @i := 0;
SELECT
    @i:=@i+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`
...