2017-09-13 16 views
0

我有一個表包含Sql server 2014中的傳感器數據,每個傳感器都有自己的傳感器ID。我想通過計算當前值與基於單個sensorid的logdate減去之前值之​​間的消耗來計算和設置/更新消耗領域,例如sensorid = 8555.sql server根據第一個較早的記錄設置消耗值

sensorid 8555的當前表結構:

+----------+-------------------------+---------+-------------+ 
| SensorId |   LogDate   | Value | Consumption | 
+----------+-------------------------+---------+-------------+ 
|  8555 | 2016-10-03 13:00:00.000 | 0.00000 |  Null | 
|  2478 | 2016-11-09 09:00:00.000 | 0.00000 |  0.00000 | 
|  2478 | 2016-11-09 10:00:00.000 | 0.00000 |  0.00000 | 
|  8555 | 2016-10-03 14:00:00.000 | 1.00000 |  Null | 
|  8555 | 2016-10-03 15:00:00.000 | 1.00000 |  Null | 
|  8555 | 2016-10-03 16:00:00.000 | 1.00000 |  Null | 
|  8555 | 2016-10-03 17:00:00.000 | 2.00000 |  Null | 
|  8555 | 2016-10-03 18:00:00.000 | 2.00000 |  Null | 
|  8555 | 2016-10-03 19:00:00.000 | 4.00000 |  Null | 
+----------+-------------------------+---------+-------------+ 

最終的結果應該是這樣的:

+----------+-------------------------+---------+-------------+ 
| SensorId |   LogDate   | Value | Consumption | 
+----------+-------------------------+---------+-------------+ 
|  8555 | 2016-10-03 13:00:00.000 | 0.00000 |  0.00000 | 
|  2478 | 2016-11-09 09:00:00.000 | 0.00000 |  0.00000 | 
|  2478 | 2016-11-09 10:00:00.000 | 0.00000 |  0.00000 | 
|  8555 | 2016-10-03 14:00:00.000 | 1.00000 |  1.00000 | 
|  8555 | 2016-10-03 15:00:00.000 | 1.00000 |  0.00000 | 
|  8555 | 2016-10-03 16:00:00.000 | 1.00000 |  0.00000 | 
|  8555 | 2016-10-03 17:00:00.000 | 2.00000 |  1.00000 | 
|  8555 | 2016-10-03 18:00:00.000 | 2.00000 |  0.00000 | 
|  8555 | 2016-10-03 19:00:00.000 | 4.00000 |  2.00000 | 
+----------+-------------------------+---------+-------------+ 

我已經沖刷谷歌的解決方案,我只能找到一個版本的答案對於MySQL的,我不知道如何轉換到sql服務器。 我知道update語句應該包含LAG,並且可能使用CTE,但是我還沒有找到關於如何在Web上使用這些語句的簡單解釋。

任何幫助,將不勝感激。

回答

1

BEGIN TRAN

CREATE TABLE #T (SensorId INT , LogDate DATETIME, Value DECIMAL(15,4), Consumption DECIMAL(15,4)) 
INSERT INTO #T 
SELECT  8555 , '2016-10-03 13:00:00.000' ,0.00000 ,Null  UNION ALL 
SELECT  2478 , '2016-11-09 09:00:00.000' ,0.00000 ,0.0000 UNION ALL 
SELECT  2478 , '2016-11-09 10:00:00.000' ,0.00000 ,0.0000 UNION ALL 
SELECT  8555 , '2016-10-03 14:00:00.000' ,1.00000 ,Null  UNION ALL 
SELECT  8555 , '2016-10-03 15:00:00.000' ,1.00000 ,Null  UNION ALL 
SELECT  8555 , '2016-10-03 16:00:00.000' ,1.00000 ,Null  UNION ALL 
SELECT  8555 , '2016-10-03 17:00:00.000' ,2.00000 ,Null  UNION ALL 
SELECT  8555 , '2016-10-03 18:00:00.000' ,2.00000 ,Null  UNION ALL 
SELECT  8555 , '2016-10-03 19:00:00.000' ,4.00000 ,Null  


GO 
SELECT * FROM #T 
;with CTE as (
    select SensorId, 
     ROW_NUMBER() OVER (Order By SensorId,LogDate) Rownum, 
     LogDate, Value 
    FROM #T 
) 

UPDATE #T SET Consumption= ISNULL(curr.Value - prev.Value,0) 
from #T INNER JOIN 
CTE curr ON #T.LogDate= curr.LogDate 
left join CTE prev on curr.Rownum = (prev.Rownum + 1) 


SELECT * FROM #T 
ROLLBACK TRAN 

enter image description here

+0

Alfaiz嗨,使用select語句我知道如何計算消費,問題是我想更新表,寫消耗值回表。 – lazylorax

+0

@lazylorax已更新查詢檢查它。 –

+0

嗨阿爾法茲,我做了一個不好的數據表示。我在同一個表中有多個sensorids,並且可以混合rownumbers,例如,可能有50行sensorid 4588,然後是3行8555,然後讓32行sensorid 5948等。這將是一個查詢只更新一個傳感器ID的消耗值?我試着用「WHERE SensorId = 8555查詢,但是這給了我錯誤的值。 – lazylorax

相關問題