Расчет среднего на основе месяца и идентификатора в SQL - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть пример таблицы, как показано ниже, и я хотел бы сделать среднее на основе MONTH из DATE и ID. Есть ли способ, которым я мог бы сделать это в SQL.

Table:Input

DATE ID VOLUME 20080630 A 45 20080628 A 23 20080629 A 34 20080627 A 33 20080730 A 45 20080728 A 12 20080730 A 34 20080724 A 56 20080430 A 34 20080428 A 23 20080630 B 12 20080628 B 45 20080629 B 67 20080627 B 78 20080730 B 45 20080728 B 12 20080730 B 34 20080724 B 56 20080430 B 2 20080428 B 34

Table:Output

DATE ID VOLUME AVERAGE 20080630 A 45 33.75 20080628 A 23 33.75 20080629 A 34 33.75 20080627 A 33 33.75 20080730 A 45 36.75 20080728 A 12 36.75 20080730 A 34 36.75 20080724 A 56 36.75 20080430 A 34 28.5 20080428 A 23 28.5 20080630 B 12 50.5 20080628 B 45 50.5 20080629 B 67 50.5 20080627 B 78 50.5 20080730 B 45 36.75 20080728 B 12 36.75 20080730 B 34 36.75 20080724 B 56 36.75 20080430 B 2 18 20080428 B 34 18

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Если вы используете сервер mssql , значит

select t1.*, t2.AVG
from TABLE1 t1
join
(
    SELECT avg(volume) as AVG, MONTH(date) as DATE
    FROM TABLE1
    GROUP BY MONTH(date), ID
) t2 on MONTH(t1.DATE) = t2.DATE

Выход будет соответствовать требуемому. Запрос выберет все столбцы из исходной таблицы и добавит GROUP BY на один столбец.

0 голосов
/ 30 апреля 2018

Это стандартный ответ SQL, поскольку вы не пометили свою СУБД:

AVG(VOLUME)
OVER (PARTITION BY EXTRACT(YEAR FROM datecolumn)
                  ,EXTRACT(MONTH FROM datecolumn)) 
0 голосов
/ 30 апреля 2018

Вы можете попробовать этот запрос:

select DATE_FORMAT(date,'%Y%m'), id, avg(volume) from xxx1 
    group by DATE_FORMAT(date,'%Y%m'), ID;

или

select DATE_FORMAT(date,'%m'), id, avg(volume) from xxx1 
    group by DATE_FORMAT(date,'%m'), ID

Пояснение:

DATE_FORMAT(date,'%Y%m') извлекает месяц и год из даты. Тогда как DATE_FORMAT(date,'%m') извлекает только месяц. (Я не был уверен, хотите ли вы месяц без года).

По сути, вы извлекаете месяц, а затем группируете его вместе с идентификатором и вычисляете среднее значение объема для этих групп.

...