加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 创建一个查询以填补由于数据错误而导致的表空白

发布时间:2020-12-12 07:07:36 所属栏目:MsSql教程 来源:网络整理
导读:我有一个包含以下架构的表: DateTime [Creation Date] PKint [Data] 列数据具有来自传感器的值,如下所示: 123225354578021512331025552678 如您所见,值总是递增. 由于传感器中的问题,我们有时在有效值之间得到0.当我们尝试使用数据时,这会产生一些问题,因此
我有一个包含以下架构的表:
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

好的捕获,这是修改后的sql,它考虑到了这一点:

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连续零)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读