如何计算平均值并更新它来代替零?使用SSIS

时间:2016-11-02 06:33:59

标签: sql sql-server ssis

提前谢谢你。 我有Mytable1

Site_name | date& Time                |PowerOutput         

xyz001    |2013-07-21 01:00:00.000    |192
xzu001    |2013-07-21 02:00:00.000    |189    
abf003    |2013-07-21 03:00:00.000    |0
ACT0001   |2013-07-21 04:00:00.000    |178

我想计算前一行的平均值,如果是零则计算下一行。

我的输出表应该是:

Sitename  |date&time                  |Power_output   

xyz001    |2013-07-21 01:00:00.000    |192
xzu001    |2013-07-21 02:00:00.000    |189 
abf003    |2013-07-21 03:00:00.000    |189
ACT0001   |2013-07-21 04:00:00.000    |178

逻辑是:

((上一个值 - 下一个值)/前一个值)* 100 <5, 如果这是真的,那么它应该插入先前的值

((上一个值 - 下一个值)/前一个值)* 100&gt; = 5, 如果这是真的那么它应该保持为零。

1 个答案:

答案 0 :(得分:1)

试试这个

BEGIN TRAN

DECLARE @Id INT ,@PreValue INT,@NextValue INT
CREATE TABLE #table(_Id INT IDENTITY(1,1) , Site_name VARCHAR(100),_dateTime DATETIME,PowerOutput INT,_upFlg TINYINT DEFAULT(0))        

INSERT INTO #table( Site_name ,_dateTime ,PowerOutput)
SELECT 'xyz001'    ,'2013-07-21 01:00:00.000'   ,192 UNION ALL
SELECT 'xzu001'    ,'2013-07-21 02:00:00.000'    ,189    UNION ALL 
SELECT 'abf003'    ,'2013-07-21 03:00:00.000'    ,0UNION ALL
SELECT 'ACT0001'    ,'2013-07-21 04:00:00.000'    ,178


WHILE EXISTS(SELECT 1 FROM #table WHERE PowerOutput = 0 AND _upFlg = 0)
BEGIN

     SELECT Top 1 @Id = _Id FROM #table WHERE PowerOutput = 0 AND _upFlg = 0

     SELECT @PreValue = PowerOutput FROM #table WHERE _Id = @Id - 1
     SELECT @NextValue = PowerOutput FROM #table WHERE _Id = @Id + 1

     IF  ( (@PreValue-@NextValue)/@PreValue ) < 5
       UPDATE #table SET PowerOutput = @PreValue WHERE _id = @id

     UPDATE #table SET _upFlg = 1 WHERE _Id = @Id

END


SELECT * FROM #table




ROLLBACK TRAN