sql时间加权平均值

时间:2017-11-13 08:26:29

标签: sql sql-server

我有一张时间和温度表 - 在每次温度变化时都有一排。我想要温度的加权平均值 - 如果是1小时1度,2度9小时,加权平均温度是1.9度。我知道如何计算加权平均数,而且我知道一点关于选择...结束...按...分组顺序,我认为这是可以做到的,但我不能看到如何得到我想要的东西。

这里有一些数据......非常感谢您的帮助。

create table dbo.Temps (EffectiveDateTime datetime2(7), Temp float)

insert into dbo.Temps values('2017-04-25 13:51:45.2630000', 0.19)

insert into dbo.Temps values('2017-04-25 14:13:24.1590000', 0.29)

insert into dbo.Temps values('2017-04-25 14:53:10.2590000', 0.39)

insert into dbo.Temps values('2017-04-25 13:46:27.0650000', 0.49)

insert into dbo.Temps values('2017-04-25 14:10:50.2670000', 0.59)

insert into dbo.Temps values('2017-04-25 14:48:10.7570000', 0.69)

insert into dbo.Temps values('2017-04-25 14:04:42.9650000', 0.79)

insert into dbo.Temps values('2017-04-25 14:27:59.5590000', 0.89)

insert into dbo.Temps values('2017-04-25 14:56:38.8550000', 0.99)

insert into dbo.Temps values('2017-04-25 14:08:11.8580000', 1.09)

insert into dbo.Temps values('2017-04-25 14:33:39.4540000', 1.19)

3 个答案:

答案 0 :(得分:0)

您应该先找到时间间隔。你说几个小时,但我使用分钟才能更准确 - 你可以改变这个设置其他日期部分:

WITH DataSource AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [EffectiveDateTime] ASC) AS [RowID]
          ,*
    FROM Temps
)
SELECT TS.[Temp]
      ,DATEDIFF(MINUTE, TS.[EffectiveDateTime], TE.[EffectiveDateTime])
FROM DataSource TS
INNER JOIN DataSource TE
    ON TS.[RowID] = TE.[RowID] - 1;

这将给你特定度数的临界时间:

enter image description here

最后的查询是将这个值与SUM(temp * minutes)相加并将它们分成所有分钟:

WITH DataSource AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [EffectiveDateTime] ASC) AS [RowID]
          ,*
    FROM Temps
)
SELECT SUM(TS.[Temp] * DATEDIFF(MINUTE, TS.[EffectiveDateTime], TE.[EffectiveDateTime])) / SUM(DATEDIFF(MINUTE, TS.[EffectiveDateTime], TE.[EffectiveDateTime]))
FROM DataSource TS
INNER JOIN DataSource TE
    ON TS.[RowID] = TE.[RowID] - 1

答案 1 :(得分:0)

假设您的SQL Server版本支持LEAD函数,您可能正在考虑这样的事情:

;with cte as
(select *, lead(effectivedatetime) over (order by effectivedatetime) timelead
from dbo.temps)

,processed as
(select *, datediff(mi,effectivedatetime,timelead)/cast(60 as decimal(10,2)) as hrdiff
from cte)

select sum(hrdiff*temp)/sum(hrdiff)
from processed

首先使用LEAD获取下一个温度读数,它们以小时为单位得到时差,最后计算加权平均值。当然,您需要针对上述情况调整精度。

SQLFiddle Demo

答案 2 :(得分:0)

在你的情况下,温度的加权平均值 - 如果是1小时1度,2度9小时,加权平均温度是1.9度

这将是(1 x 1 + 2 * 9)/(1 + 9)= 1.9

如果你有另一个表有一个额外的列持续时间会更好/更容易。即另一个表,用于计算与下一次温度变化(持续时间)的时间差。

然后sql语句会是这样的。

假设您的新表名是TempDuration,其列名持续时间和温度。

select sum(TempDuration.temperature * TempDuration.duration) / sum(TempDuration.duration)
from TempDuration
  • 注意:如果没有其他表需要更多步骤来计算持续时间并使sql更复杂。