我有一个包含以下架构的表:
@H_403_17@解决方法
DateTime [Creation Date] PK int [Data]
列数据具有来自传感器的值,如下所示:
123 225 354 578 0 2151 2331 0 2555 2678
如您所见,值总是递增.
由于传感器中的问题,我们有时在有效值之间得到0.当我们尝试使用数据时,这会产生一些问题,因此我们希望用某些东西来填补这些空白.理想情况下,我们希望在上一个值和下一个值之间放置一个平均值,如果不可能,我们希望重复前一个值.
这只是一个查询可行吗?
提前致谢.
也许不是最有效的,但应该工作:
WITH cte AS (SELECT [Creation Date],Data,rn=Row_number() OVER(ORDER BY [Creation Date]) FROM dbo.Table) UPDATE cte SET Data = ( ( (SELECT c2.Data FROM cte c2 WHERE c2.rn = cte.rn - 1) + (SELECT c2.Data FROM cte c2 WHERE c2.rn = cte.rn + 1) ) / 2 ) WHERE Data = 0;
我在CTE中使用Row_Number来获取按创建日期排序的连续数字.然后,此数字用于根据其上一个和下一个值获取新数据.
Here’s具有类似模式的演示(我使用了int而不是datetime):
更新
Nice one but it does not handle gaps with multiple 0
WITH cte AS (SELECT [Creation Date],rn=Row_number() OVER(ORDER BY [Creation Date]) FROM dbo.Table) UPDATE cte SET Data = ( ( (SELECT c2.Data FROM cte c2 WHERE c2.rn = (SELECT MAX(RN)FROM CTE c3 WHERE c3.RN<cte.RN AND c3.Data<>0)) + (SELECT c2.Data FROM cte c2 WHERE c2.rn = (SELECT MIN(RN)FROM CTE c3 WHERE c3.RN>cte.RN AND c3.Data<>0))) / 2 ) WHERE Data = 0;
Demo(5,6连续零)