Ign*_*cia 7 sql t-sql sql-server
我有一个包含以下架构的表:
DateTime [Creation Date] PK
int [Data]
Run Code Online (Sandbox Code Playgroud)
列数据具有来自传感器的值,如下所示:
123
225
354
578
0
2151
2331
0
2555
2678
Run Code Online (Sandbox Code Playgroud)
如您所见,值总是递增.
由于传感器中的问题,我们有时在有效值之间得到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;
Run Code Online (Sandbox Code Playgroud)
我Row_Number在 CTE 中使用来获取按 排序的连续数字Creation Date。然后用这个数字根据它的上一个和下一个值来获取新的数据。
这是一个具有类似架构的演示(我使用了 anint而不是datetime):
更新
不错,但它不能处理多个 0 的间隙
很好,这是考虑到这一点的修改后的 sql:
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 = (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;
Run Code Online (Sandbox Code Playgroud)
演示(5,6 上有连续的零)