2017-09-13 2 views
0

J'ai une table contenant des données de capteur dans Sql Server 2014, avec plusieurs capteurs ayant chacun son propre identifiant de capteur. Je veux calculer et mettre/mettre à jour le champ de consommation en calculant la consommation entre la valeur courante et en soustrayant la valeur précédente basée sur la valeur log pour un seul capteur, par exemple sensorid = 8555.sql server set valeur de consommation basée sur le premier enregistrement plus ancien

Structure de table actuelle pour 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 | 
+----------+-------------------------+---------+-------------+ 

le résultat final devrait être le suivant:

+----------+-------------------------+---------+-------------+ 
| 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 | 
+----------+-------------------------+---------+-------------+ 

J'ai écumé google pour trouver une solution, et je ne pouvais trouver une version de la réponse pour Mysql, que je ne sais pas comment convertir au serveur sql. Je sais que la déclaration de mise à jour devrait contenir des LAG et probablement utiliser des CTE, mais je n'ai pas trouvé d'explication facile à comprendre sur la façon d'utiliser ceux-ci sur le web.

Toute aide serait appréciée.

Répondre

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

Salut Alfaiz, en utilisant une instruction select je sais comment calculer la consommation, le problème est que je veux mettre à jour la table et écrire les valeurs de consommation de retour dans la table . – lazylorax

+0

@lazylorax Mis à jour La requête le vérifie. –

+0

Salut Alfaiz, j'ai fait une mauvaise représentation des données. J'ai plusieurs sensorids dans la même table, et les runners peuvent être mélangés, par exemple il peut y avoir 50 rangées de sensorid 4588 puis 3 rangées de 8555 et alors disons 32 rangées de sensorid 5948 etc. Quelle serait une requête qui serait mettre à jour les valeurs de consommation pour un seul capteur? J'ai essayé votre question avec un "WHERE SensorId = 8555, mais cela me donne les mauvaises valeurs – lazylorax