根据SQL中的月和ID计算平均值

时间:2018-04-30 17:13:31

标签: sql count distinct average

我有一个如下所示的示例表,并希望根据MONTHDATE的{​​{1}}进行平均。有什么方法可以在SQL中做到这一点。

ID

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

3 个答案:

答案 0 :(得分:1)

您可以尝试此查询:

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')仅提取月份。 (我不太确定,如果你想要没有一年的月份)。

基本上,您提取月份,然后将其与ID一起分组,并计算这些组的体积平均值。

答案 1 :(得分:1)

这是标准SQL答案,因为您没有标记DBMS:

AVG(VOLUME)
OVER (PARTITION BY EXTRACT(YEAR FROM datecolumn)
                  ,EXTRACT(MONTH FROM datecolumn)) 

答案 2 :(得分:0)

如果您使用的是mssql服务器then so

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添加一列。