Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用前几行的平均值更新SQL Server中的行_Sql Server_Tsql_Select_Sql Update - Fatal编程技术网

Sql server 如何使用前几行的平均值更新SQL Server中的行

Sql server 如何使用前几行的平均值更新SQL Server中的行,sql-server,tsql,select,sql-update,Sql Server,Tsql,Select,Sql Update,我在一个数据库中工作,这个数据库不断地填充着来自一台设备的数据。不幸的是,在过去的几个月里,一些数据出现了错误,使数据库充满了垃圾。为了解决这个问题,我需要用每个错误行之前保存的最后三个数据的简单平均值来更新错误行 有一个直接的代码来做这件事吗?在过去的几个小时里,我一直在手动计算和更新每一行,这并没有多大的效率。我知道我可以使用UPDATE with SELECT来更改具有另一个表中数据的行的数据,但是如何选择列id=equipment_id、sum、除以3的最后三个数据,并在需要的位置进行更

我在一个数据库中工作,这个数据库不断地填充着来自一台设备的数据。不幸的是,在过去的几个月里,一些数据出现了错误,使数据库充满了垃圾。为了解决这个问题,我需要用每个错误行之前保存的最后三个数据的简单平均值来更新错误行

有一个直接的代码来做这件事吗?在过去的几个小时里,我一直在手动计算和更新每一行,这并没有多大的效率。我知道我可以使用UPDATE with SELECT来更改具有另一个表中数据的行的数据,但是如何选择列id=equipment_id、sum、除以3的最后三个数据,并在需要的位置进行更新?我是这样想的:

UPDATE problem_table 
SET Col1 = problem_table_id.Col1, 
    Col2 = problem_table_id.Col2 
FROM (
    SELECT EQUIP_ID, Col1, Col2 
    FROM problem_table) problem_table_id
WHERE 
    EQUIP_ID = the_id_i_want and
    DATA_ID < curr_buggy_row

但这类数据不会有最后一个X数据的平均值,但充其量是在buggy行的1之前的最后一个数据。

这里有一个选项。CTE的工作方式与可更新视图一样,直接影响基础表

WITH CTE AS(
SELECT *,
    AVG( Col1) OVER( ORDER BY SomeDate ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS AVGCol1,
    AVG( Col2) OVER( ORDER BY SomeDate ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS AVGCol2
FROM problem_table
WHERE 
    EQUIP_ID = @the_id_i_want and
    DATA_ID <= @curr_buggy_row
)
UPDATE CTE 
SET Col1 = AVGCol1,
    Col2 = AVGCol2
WHERE 
    DATA_ID = curr_buggy_row;

这是一个很好的起点。这可能会让您有一段很好的路要走:检查这样的示例:告诉SQL Server,我们希望过去12行的st平均值按年份和月份排序。这没有意义,您希望如何填充?还是现在的马车?你是在寻求一种一次只在一个id上工作的解决方案吗?@TabAlleman是的,这就是你的意图。在所有有缺陷的行都是带有错误数据且没有模式的指数行之后。我必须逐行查看我的数据库,找出垃圾数据是何时插入的:/我认为我的评论一点也不不合理。您是对的,大多数问题都没有表定义或示例数据。这就是为什么有如此多的评论要求这样做。当然,你可能会很幸运,让路易斯给你一个答案,但这并不意味着你将来不应该提供这些细节。如果更多的人努力提供一个有效的例子,就会有更多的问题得到回答,而因缺乏细节而结案的人就会少得多。很高兴你得到了答案。谢谢,它工作得很好!注意:我想在集合区域的AVGCol1后面需要一个逗号。@作为补充:我如何告诉代码更新行中需要的小数数?在这里,它用最大小数+10填充,而我只需要6,这完全取决于数据类型。可以使用“强制转换/转换”或简单的圆。