2016-10-03 44 views
0

我需要从每行的第1条记录中计算每天的平均值。 我可以通过在while循环中迭代来实现,但我确信我可以实现这个更简单。我需要查询以计算“金额”字段附近的avgAmount。在SQL Server中计算每行的平均值

这个平均值是通过计算总和得出的,并除以每行最小和最大日期的差值。

create table a 
(
date datetime, 
dept varchar(50), 
amount float 
) 

insert into a values ('2016-02-07', 'abc', 25) 
insert into a values ('2016-02-27', 'abc', 20) 
insert into a values ('2016-03-09', 'abc', 30) 
insert into a values ('2016-03-28', 'abc', 45) 
insert into a values ('2016-04-07', 'abc', 40) 
insert into a values ('2016-04-30', 'abc', 50) 
insert into a values ('2016-05-07', 'abc', 60) 
insert into a values ('2016-05-27', 'abc', 50) 
insert into a values ('2016-06-30', 'abc', 38) 
insert into a values ('2016-07-17', 'abc', 45) 
insert into a values ('2016-07-30', 'abc', 55) 
insert into a values ('2016-08-07', 'abc', 70) 

SQLFIDDLE

任何帮助吗?

+0

你的意思是,在这情况下,金额的总和除以7之间的天数2月和7月7日?如果是这样,结果应该只包含一个部门的数据,还是应该由每个部门来回答?这是什么数据库运行? SQL Server? MySQL的?哪一个? –

回答

1

试试这个:

with FirstCalc as 
(
select dept, min(date) as MinDate, max(date) as MaxDate, sum(amount) as TotalAmount 
from a 
group by dept 
) 
select dept, TotalAmount/datediff(dd, MinDate, MaxDate) as AvePerDay 
from FirstCalc 
2

一种方式来做到这一点是:

SELECT date, amount, 
AVG(amount) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT 
ROW) AS AvAmount 
FROM a 
ORDER BY date 

SQL Fiddle

+0

这是一个非常优雅的解决方案,但不幸的是,“数据库所在的SQL Server 2008中未实现”无限前缀和当前行“。 已经在SQLfiddle中测试过了,结果很好。 Thabks为您的即时帮助! – NotForFun

1

如果它的SQL服务器:

Select Sum(a.amount)/datediff(day, start.Date, end.Date) 
From a 
    join a start 
    on start.Date = (Select Min(Date) from a 
        Where Year(date) = @Year 
         and dept = a.Dept) 
    join a end 
    on end.Date = (Select Max(Date) from a 
        Where Year(date) = @Year 
         and dept = a.Dept) 
Where Year(a.Date) = @year