使用 {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]
在下面的代码中,我试图计算每个月与过去 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]