使用 {Rows Preceding} 作为移动平均值 sql

Using {Rows Preceding} for moving average sql

在下面的代码中,我试图计算每个月与过去 6 个月相比的移动平均值,但是 SQL 排除了平均值分母中为空的行。

例如:-

假设 9 月的 avg(count(*)) 是 4,3 月到 8 月的值是 0.In 我的代码,SQL 是 4/1 但我需要它包括前几个月也是如此,即使它们没有值 (4/6)。

select [Name],[Report Month]
,avg(count(*))  over (partition by [Name]
                              order by [Report Month]
                              ROWS 5 PRECEDING)
FROM dbo.Sample
group by [Name],[Report Month]

根据 Tab 的 suggestion.I 尝试创建一个月 table 以与 dbo.sample 连接,我不熟悉创建一个月 table,因此我使用一个在线资源,下面是代码。(我用的是SQLServer2014,资源里说,代码是2000的)

CREATE TABLE CalendarMonths (
  date DATETIME,
  PRIMARY KEY (date)
)

DECLARE
  @basedate DATETIME,
  @offset   INT
SELECT
  @basedate = '01 Jan 2000',
  @offset = 1

WHILE (@offset < 2048)
BEGIN
  INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, date) FROM CalendarMonths
  SELECT @offset = @offset + @offset
END

非常感谢您的帮助!!..提前致谢。

最佳,

您有 0 行受到影响,因为您从空的 table.

中执行了 INSERT...SELECT

如果你替换这个应该可以工作:

 INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, date) FROM CalendarMonths
 SELECT @offset = @offset + @offset

有了这个:

INSERT INTO CalendarMonths SELECT DATEADD(MONTH, @offset, @basedate)
SET @offset = @offset + 1

然后仅在月份和年份加入本月 table,如下所示:

select [Name],cm.[date] AS ReportMonth
,avg(count(*))  over (partition by [Name]
                              order by cm.[date]
                              ROWS 5 PRECEDING)
FROM dbo.Sample s
RIGHT OUTER JOIN CalendarMonths cm
  ON MONTH(s.[Report Month])=MONTH(cm.[date])
  AND YEAR(s.[Report Month])=YEAR(cm.[date])

group by [Name],cm.[date]