SQL-запрос для извлечения среднего сгруппированы по столбцу - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь сгенерировать SQL-запрос для извлечения среднего ежемесячного энергопотребления (в год) для идентификатора.

+----+------------+------------+
| id | powerusage |    date    |
+----+------------+------------+
|  1 |        750 | 2011-12-2  |
|  1 |       1000 | 2011-12-1  |
|  1 |       1500 | 2011-11-15 |
|  1 |        100 | 2011-11-13 |
|  1 |         50 | 2011-11-10 |
|  2 |        500 | 2011-11-15 |
|  2 |        200 | 2011-11-13 |
+----+------------+------------+

Поэтому, если ID = 1, я хочу (среднее число ноября + среднее значение декабря) / 2 = (1750/2 + 1650/3) / 2 = 712,5

select AVG(powerusage) as avgMontlyPowerUsage
from usagetable 
where id = 1 and YEAR(date) = 2011

Но это даст мне 680.

Как получить среднее значение по группе?

Большое спасибо за все ответы! Но я вижу, что мой вопрос неверен. Смотрите обновленный вопрос

Ответы [ 5 ]

3 голосов
/ 02 декабря 2011

Что-то вроде

select AVG(montlyPowerUsage) from (

SELECT MONTH(date) as mnth,sum(powerusage) as montlyPowerUsage
from usagetable 
where id = 1 and YEAR(date) = 2011 group by MONTH(date)

) t1

Для отредактированного вопроса

select AVG(montlyPowerUsage) from (

SELECT MONTH(date) as mnth,AVG(powerusage) as montlyPowerUsage
from usagetable 
where id = 1 and YEAR(date) = 2011 group by MONTH(date)

) t1
3 голосов
/ 02 декабря 2011
mysql> select avg(powerusage) 
from 
(select monthname(date), sum(powerusage) as powerusage 
from usagetable 
where id=1 and year(date)=2011
group by monthname(date)) as avg_usage;
+-----------------+
| avg(powerusage) |
+-----------------+
|       1700.0000 |
+-----------------+
select avg(total_powerusage) 
from 
(select monthname(date), sum(powerusage) as total_powerusage 
 from usagetable 
 where id=1 and year(date)=2011
 group by monthname(date)
) as avg_usage;

/* the use of subquery 
   is to return total of unique occurrences, 
   and sum powerusage of each occurrence,
   which mean, you just need to apply AVG into the subquery */
1 голос
/ 02 декабря 2011

Это должно дать вам среднемесячные значения для каждого года и пользователя. Некоторый синтаксис может быть специфичным для MS SQL, но логика должна быть хорошей.

SELECT id, AVG(usage), year FROM
(SELECT id, SUM(powerusage) as usage, YEAR(date) as Year, MONTH(date) as Month
  FROM usagetable 
  GROUP BY id, YEAR(date), MONTH(date)) as InnerTable
GROUP BY id, year
0 голосов
/ 02 декабря 2011
SELECT SUM(powerusage) / (MONTH(MAX(`date`)) - MONTH(MIN(`date`)) + 1)
           AS avgMontlyPowerUsage
FROM usagetable 
WHERE id = 1 
  AND YEAR(`date`) = 2011

или (в зависимости от того, что вам нужно, когда данных мало):

SELECT SUM(powerusage) / COUNT( DISTINCT MONTH(`date`) )
           AS avgMontlyPowerUsage
FROM usagetable 
WHERE id = 1 
  AND YEAR(`date`) = 2011

Предупреждение: ни один из вышеперечисленных не оптимизирован для производительности.

0 голосов
/ 02 декабря 2011

Попробуйте добавить группу по идентификатору

GROUP BY id

или дате, в зависимости от того, что подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...