【问题标题】:Moving Average in MS SQL?MS SQL 中的移动平均线?
【发布时间】:2021-10-28 09:01:00
【问题描述】:

我不确定这会被称为什么,因为搜索“移动平均线”一词并没有产生我想要做的事情......

我在 MSSQL 中有一个表,其中包含一系列天气观察结果,这些观察结果是不定期进行的。

我想在 SQL 中创建一个存储过程,它将时间作为输入变量,然后选择最近的观察前后,并计算该输入时间的测量值的近似值并返回这些值。

我知道我可以创建 2 行的平均值,但如果我输入 07:24 的时间并且在 07:25 进行观察,则测量值将比平均值更接近记录值。

在我的脑海中,我想我知道该怎么做,但它很乱:-

  • 计算测量时间之间的差异(分钟/整数)
  • 计算测量值之间的差异 (int/float)
  • 除以时间/值以给出每分钟的测量值
  • 计算最早时间和输入变量(分钟/整数)之间的差异
  • 将每分钟的测量值乘以输入 var 差异 (int/float)
  • 将上述步骤中的值添加到最早的时间测量变量以生成返回值

所以我担心的是:

  • 这对于 SQL 来说是不是太高级或太复杂了?
  • 如果不是,会不会是一个很长很乱的存储过程?

我不是在找人为我做,我想学习,任何指针、建议、重复的帖子或示例代码 sn-ps 都会受到极大的欢迎和研究。

【问题讨论】:

  • 如果您添加一些示例数据和所需的输出会很好。根据您的描述,您似乎需要使用 LAG/LEAD 功能
  • 我添加了我的天气表的屏幕截图。选择前后行没有问题,我通过嵌入式查询和 UNION 完成了这一点。我正在寻找更多关于查询计算方面的建议和指导
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 人们想要它作为文本的原因是因为它更容易复制到像dbfiddle.uk 这样的工具中。图片意味着它需要手动输入,如果数据量很大,没人会打扰

标签: sql-server stored-procedures


【解决方案1】:

我认为您想要做的是加权平均。这在存储过程或用户定义的函数中应该相对简单,但显然只适用于数字观察,而不适用于文本观察。

首先,我们直接在指定时间之前和之后获取观察结果。让我们称之为AB

然后我们计算A的时间和指定时间之间的秒数(我们称之为X)和AB的时间之间的秒数(我们称之为Y)。

X / Y 的计算将为我们提供A 与指定时间之间“距离”的百分比,因此(1 - X / Y) 将为我们提供与A 的“接近度”,我们可以将其用作权重加权平均。反过来适用于B

所以最终的计算是: A x (1 - X / Y) + B x (X / Y)

例如,如果指定的时间是 7:25,最近的观测值是 7:20 的 32 和 7:30 的 30,我们有以下内容:

  • A = 32, B = 30, X = 10, Y = 20
  • X / Y = 1 - X / Y = 0.5
  • Output = 31

【讨论】:

  • 布伦顿,非常感谢。就分类值而言,我可以将它们编码为整数 0 和 1,使用相同的计算和舍入,计算最终结果是 0 还是 1,然后解码回相应的分类值 - 这行不通?
  • 是的好主意,这会让你得到最接近的值。
  • 布伦顿,我似乎撞到了灯柱... FromTime 为 0630,ToTime 为 0725,测量时间为 0720,FromVar 为 80,ToVar 为 88,这给了我:A = 80 ,B = 88,X = 50(分钟)和 Y = 55(分钟),计算得出的值为 80.7272……我希望它更接近 88,也许是 87.272。我不知道如何将我的回复更改为格式更好的方式,希望您能理解
  • 啊,我想我可能把权重放在了错误的地方。你可以试试这个:A x (1 - X / Y) + B x (X / Y)。我会更新我的答案...
  • 嗨,布伦顿,抱歉耽搁了 - 有一些时间了。只是为了确认,这完美无缺。非常感谢您的努力和支持 :)
猜你喜欢
  • 2012-05-24
  • 2017-09-01
  • 2013-12-22
  • 2021-06-14
  • 2014-12-24
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多