【问题标题】:T-SQL - Calculate Average for every 4 month sequentiallyT-SQL - 按顺序计算每 4 个月的平均值
【发布时间】:2019-10-23 10:46:26
【问题描述】:

我有下表:

Column1 Date         Data  Column2   Avg
Test1   01/01/2019     1     2
Test1   01/20/2019     2     3
Test1   01/23/2019     3     4
Test1   02/20/2019     4     3
Test1   03/20/2019     5     1
Test1   04/20/2019     6     2
Test1   05/20/2019     7     0
Test1   06/20/2019     8     1
Test1   07/20/2019     9     1
Test1   08/20/2019     10    2
Test1   09/20/2019     11    3
Test1   10/20/2019     12    4
Test1   01/01/2020     13    6
Test1   02/01/2020     14    8
Test1   03/01/2020     15    9
Test1   04/01/2020     16    1

我需要在 Temp 表的 select 语句中创建一个名为 Avg 的附加列,该列将从 Column2 顺序获取值并将其除以(每 4 个月的数据平均值除以 30)。 所以,例如,

  • 第一个 Avg 值为 2(来自 Column2)/(Avg(1,2,3,4,5,6)(来自 数据栏) /30)
  • 第二个 Avg 值为 3 / (Avg(4,5,6,7) /30)
  • 第三个平均值将为 4 / (Avg(5,6,7,8) /30)

等等。

【问题讨论】:

  • 你能更好地解释一下你的平均数字是如何选择的吗?
  • 您想要的结果也会很有用。
  • 为什么第二个不是 3 / avg(2, 3, 4, 5, 6) ?你的逻辑不清楚。
  • 嗨,戈登,这是因为一月结束于数字 3。因此,它应该从数字 4 而不是 2 开始。
  • 嗨,Shawn,请查看 Esperento57 提供的答案。它非常接近我的解决方案。

标签: sql sql-server tsql


【解决方案1】:

试试这个Fiddle

select f1.*, 
case when f3.Average30=0 then null else f1.Column2 / f3.Average30 end as Avg
from mytable f1
outer apply
(
  select avg(cast(f2.Data as decimal))/30.0 as Average30
  from mytable f2
  where f2.MyDate between f1.Mydate and EOMONTH(DATEADD(MONTH, 3, f1.MyDate))

) f3

【讨论】:

  • 非常感谢!这只是一个小问题。问题是日期是否丢失。日期肯定会按顺序排列,但有时会丢失某些日期。例如,可能是 Jan、April、May、June,而不是 Jan、Feb、March、April。因此,它应该平均 1 月、4 月、5 月和 6 月连续 4 个月的值。再次感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2016-10-02
相关资源
最近更新 更多