我有一张时间和温度表 - 在每次温度变化时都有一排。我想要温度的加权平均值 - 如果是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)
答案 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;
这将给你特定度数的临界时间:
最后的查询是将这个值与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
获取下一个温度读数,它们以小时为单位得到时差,最后计算加权平均值。当然,您需要针对上述情况调整精度。
答案 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