【发布时间】:2011-03-23 15:04:11
【问题描述】:
我正在尝试在 SQLServer 2008 中创建一个计算窗口移动平均线的函数。我对 SQL 很陌生,所以我遇到了一些困难。我试图对其执行移动平均的数据需要按天分组(它都是带时间戳的数据),然后需要对其应用可变的移动平均窗口。
我已经有一个按天(和@id)对数据进行分组的函数,它显示在底部。我有几个问题:
在移动平均函数内部调用分组函数会更好还是我应该一次完成?
是否可以获取输入到函数中的日期的移动平均线,但返回 n 天开始移动平均线,以便第一个 n 返回数据的天数不会有 0 的平均值? (即,如果他们想要从 01-08-2011 到 02-08-2011 的 7 天移动平均线,我在 01 开始计算移动平均线-01-2011 这样他们定义的第一天就有值了?)
我正在研究如何进行移动平均,并且知道移动窗口似乎是最好的选择(currentSum = prevSum + todayCount - nthDayAgoCount) / nDays 但我我仍在努力弄清楚这个的 SQL 实现。
我有一个如下所示的分组函数(出于可见性目的删除了一些变量):
SELECT
'ALL' as GeogType,
CAST(v.AdmissionOn as date) as dtAdmission,
CASE WHEN @id IS NULL THEN 99 ELSE v.ID END,
COUNT(*) as nVisits
FROM dbo.Table1 v INNER JOIN dbo.Table2 t ON v.FSLDU = t.FSLDU5
WHERE v.AdmissionOn >= '01-01-2010' AND v.AdmissionOn < DATEADD(day,1,'02-01-2010')
AND v.ID = Coalesce(@id,ID)
GROUP BY
CAST(v.AdmissionOn as date),
CASE WHEN @id IS NULL THEN 99 ELSE v.ID END
ORDER BY 2,3,4
返回一个像这样的表:
ALL 2010-01-01 1 103
ALL 2010-01-02 1 114
ALL 2010-01-03 1 86
ALL 2010-01-04 1 88
ALL 2010-01-05 1 84
ALL 2010-01-06 1 87
ALL 2010-01-07 1 82
编辑:回答我问的第一个问题:
我最终创建了一个函数,该函数声明了一个临时表并将 count 函数的结果插入其中,然后使用 user662852 中的示例计算移动平均值。
【问题讨论】:
标签: sql sql-server-2008 moving-average