【问题标题】:sql query which will calculate Moving average must exclude zero value rows将计算移动平均值的sql查询必须排除零值行
【发布时间】:2014-03-17 18:21:43
【问题描述】:

我一直在尝试计算 sql server 中超过 60 个值期间的移动平均值,但我没有成功,希望大家帮助我。

请在下面找到数据

User       startdate           Enddate           minutes     moving average 
Sync    3/15/2014 10:00     3/15/2014 11:47      107         113.4117647 
Sync    3/15/2014 12:00     3/15/2014 13:45      105         112.8627451
Sync    3/15/2014 14:00     3/15/2014 15:41      101         112.5490196
Sync    3/15/2014 16:00     3/15/2014 17:12      72          112.372549
Sync    3/16/2014 1:00      3/16/2014 1:00       0           112.372549
Sync    3/16/2014 2:00      3/16/2014 2:00       0           112.372549

要求查询不能考虑为零的行,即使它应该显示在表中,上面最后一列是例外平均值。

【问题讨论】:

  • 您能否与我们分享您使用 atm 计算移动平均线的部分(或全部)代码?
  • 你好,尼基,我的代码无法正常工作,因为我试图从不同的来源获得帮助,因此我提出了这个问题,以获得帮助!等待答复

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

试试这个。我不确定您是如何获得已放入网格的移动平均值的,我假设它们是由于之前未显示的值造成的。

DECLARE @table TABLE (
[User] NVARCHAR(10),
[StartDate] DATETIME,
[EndDate] DATETIME,
[Minutes] FLOAT,
[Average] FLOAT
)

INSERT INTO @table ([User],[startdate],[Enddate],[minutes]) VALUES 
('Sync','3/15/2014 10:00','3/15/2014 11:47',107.0),
('Sync','3/15/2014 12:00','3/15/2014 13:45',105.0),
('Sync','3/15/2014 14:00','3/15/2014 15:41',101.0),
('Sync','3/15/2014 16:00','3/15/2014 17:12',72.0),
('Sync','3/16/2014 1:00','3/16/2014 1:00',0.0),
('Sync','3/16/2014 2:00','3/16/2014 2:00 ',0.0)

UPDATE t
SET [Average] = [avg]
FROM @table t
INNER JOIN (
  SELECT  
    [startdate],
    AVG(NULLIF([Minutes],0)) OVER (PARTITION BY [User]  ORDER BY [startdate]) [avg]
  FROM
    @table
) a ON a.StartDate = t.StartDate

SELECT * FROM @table

让我知道你过得怎么样。

斯图尔特

【讨论】:

  • 你好 stuart,我正在使用 sql server 2008 r2,当我尝试运行你提供的查询时,我得到以下错误“订单”附近的语法不正确。
  • 你好斯图尔特我已经执行了查询,我得到了以下结果用户开始日期结束日期分钟平均同步 3/15/2014 10:00 3/15/2014 11:47 107 96.25 同步 3/15/2014 12:00 2014 年 3 月 15 日 13:45 105 96.25 同步 2014 年 3 月 15 日 14:00 2014 年 3 月 15 日 15:41 101 96.25 同步 2014 年 3 月 15 日 16:00 2014 年 3 月 15 日 17:12 72 96.25 同步 3/16/2014 1:00 3/16/2014 1:00 0 96.25 同步 3/16/2014 2:00 3/16/2014 2:00 0 96.25 这里除了平均值不同对于上述示例,所有行都必须是移动平均线 3 个字段的例外移动平均线将为 Average 107 106 104.3333333 92.66666667 92.66667 92.66667
  • 对不起,我没有意识到您使用的是 2012,也没有意识到您无法在 2008R2 中订购分区。我在 2012 年提供的查询运行良好,你得到了你想要的数字。我们可以做您想做的唯一方法是在 CTE 中。我会看看那个,我会尽快回复你。不过,有一些示例可以向您展示如何做到这一点。
  • brentozar.com/archive/2013/02/rolling-averages-in-sql-server 看看你能不能从那里解决。这是一个很好的例子,应该可以适应你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2011-07-25
相关资源
最近更新 更多