2016-11-02 74 views
0

預先感謝您。 我有一個Mytable1如何計算平均值並更新它以代替零?使用SSIS

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> = 5, 如果這是真的,那麼它應該保持爲零。

+1

* SELECT [日期和時間],SITE_NAME, 鉛([日期和時間],1,1)OVER(ORDER BY SITE_NAME)作爲最大值, 滯後([日期和時間],1,1- )OVER(ORDER BY site_name)As Min FROM [dbo]。[Mytable] 其中[pr_output] = 0 *我使用* lag和lead *來確定小時間隔的值爲零。 –

+0

我會得到百萬的值,我不能不斷更新這些值每一次。他們的另一種方式是通過SSIS執行此操作 –

回答

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 ((@[email protected])/@PreValue) < 5 
     UPDATE #table SET PowerOutput = @PreValue WHERE _id = @id 

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

END 


SELECT * FROM #table 




ROLLBACK TRAN 
+0

@ mansoor:感謝您的幫助。我會以百萬計得到這些值,而且我不能每次都更新這些值。他們的另一種方式是通過SSIS來做到這一點 –