按星期几(或日期减去7)的SQL滚动平均值

时间:2016-03-17 16:51:40

标签: sql sql-server sql-server-2008-r2

我有一个查询来提取数据并将其分组到:

Date        Type        Total
3/1/2016    Sales       9
3/1/2016    Support     8
3/1/2016    Service     5
3/1/2016    Other       48
3/2/2016    Sales       42
3/2/2016    Support     86
3/2/2016    Service     67
3/2/2016    Other       25
3/2/2016    VIP         12
3/3/2016    Sales       46
3/3/2016    Support     45
3/3/2016    Service     78
3/3/2016    Other       70
3/3/2016    VIP         26

我也希望包括滚动平均值。因此,对于2016年3月1日的销售,滚动平均值将是前几周的10个。基本上:

select average(Total) where Date in ('2/23/2016','2/16/2016','2/9/2016','2/2/2016','1/26/2016','1/19/2016','1/12/2016','1/5/2016','12/29/2015','12/22/2015') and Type = "Sales" 

有没有办法在1个查询中有效地执行此操作?

3 个答案:

答案 0 :(得分:1)

使用类似的东西:

class Grade {
    let string = PostViewController.sharedPost
    var newString : String!

 ...

    init() {
        newString = self.string.postText.text

答案 1 :(得分:0)

考虑以下内容,您可以将查询放在内部和外部查询的Qry占位符中。或者,您可以将子查询与原始查询内联。所有10个每周日期都在IN()子句中明确指定,因为您只需要相对于行的相应日期的那些选择日期(即星期二,星期三)。

SELECT dT.Date, dT.Type, dT.Total,

       (SELECT Avg(sub.Total)
        FROM Qry sub
        WHERE sub.Date IN
              (DateAdd(d, -7,  dT.Date),
               DateAdd(d, -14, dT.Date),
               DateAdd(d, -21, dT.Date),
               DateAdd(d, -28, dT.Date),
               DateAdd(d, -35, dT.Date),
               DateAdd(d, -42, dT.Date),
               DateAdd(d, -49, dT.Date),
               DateAdd(d, -56, dT.Date),
               DateAdd(d, -63, dT.Date),
               DateAdd(d, -70, dT.Date))    
        AND sub.Type = dT.Type) As RollAvg

FROM Qry dT

答案 2 :(得分:0)

我最终选择了临时表 首先我创建了一个#TempTotal

Select Date, DATENAME(dw,Date) as DayName, Type, Count(*) as Total
INTO #TempTotal
From tbl
Where Date >=@StartDate and Date <= @EndDate
Group by Date, DayName, Type

然后我创建了#TempAverage:

Select DayName, Type, avg(Total) 
INTO #TempAverage
from 
(
select Date, DATENAME(dw,Date) as DayName, Type, Count(*) as Total
from tbl
where Date >=DateAdd(d, -70,  @StartDate) and Date <= @StartDate
Group by Date, DayName, Type
) Totals
Group by DayName, Type

最后,我们有一个简单的加入

Select TT.Date, Type, TT.Total, TA.Average
FROM
#TempTotal TT
Left Join #TempAverage TA on TA.DayName = TT.DayName and TA.Type= TT.Type