Bonjour,
Je cherche à obtenir les consommations d'un compteur d'eau "virtuel" en faisant l'addition (ou soustraction suivant le besoin) des consommations de deux compteurs qui ont leur relevés dans une table.
J'ai une première table 'devicestatus' qui liste les devices compteurs d'eau réels avec les colonnes 'dev_id' et 'dev_name'.
Une seconde table 'meter' qui fait les enregistrement régulier des relevés de compteurs avec une colonne 'meter_devlog_id' (qui correspond au dev_id'), meter_value (le relevé du compteur, c'est un index qui ne fait que "monter", comme un index de compteur électrique) et 'meter_logdate' (current timestamp de chaque relevé, environ toutes les 15min).
J'ai réussi, avec une grande aide bien précieuse, à calculer la consommation par jour d'un compteur : CONSO J = VALUE MAX J - VALUE MAX J-1
Je cherche à faire la même chose pour un compteur "virtuel' : addition de deux compteurs : CONSO J = (VALUE MAX COMPT 1 J - VALUE MAX COMPT1 J-1) + (VALUE MAX COMPT 2 J - VALUE MAX COMPT2 J-1)
En clair :
Ma table 'devicestatus' :
dev_id dev_name 7 Compteur 7 8 Compteur 8
La table 'meter' avec des relevés de compteurs sur 2 jours :
meter_devlog_id meter_value meter_logdate 7 11 2021-02-21 08:00:00 8 16 2021-02-21 08:00:01 7 12 2021-02-21 22:30:00 8 19 2021-02-21 22:30:01 7 15 2021-02-22 08:00:00 8 29 2021-02-22 08:00:01 7 20 2021-02-22 22:30:00 8 30 2021-02-22 22:30:01
Le résultat des consommation des compteurs 7 ou 8 :
dev_id logdate conso 7 21/02/2021 null 8 21/02/2021 null 7 22/02/2021 8 (20-12) 8 22/02/2021 11 (30-19)
Le résultat que je souhaite obtenir :
dev_id logdate conso 7 + 8 21/02/2021 null 7 + 8 22/02/2021 19 ((20-12)+(30-19))
Pour faire la consommation d'un compteur, voici ma démarche actuelle (un grand merci à celui qui se reconnaîtr :
Création d'une vue pour isoler les maximum par jour :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE or REPLACE VIEW V_CONSO_DAY as (SELECT meter_devlog_id as V_CONSO_meter_devlog_id , max(meter_value) as V_CONSO_meter_value , date(meter_logdate) as V_CONSO_meter_logdate FROM `meter` GROUP BY meter_devlog_id , date(meter_logdate) ORDER BY meter_devlog_id , date(meter_logdate) ) ;
Requête pour obtenir la consommation des 7 derniers jours du compteur 7 :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 SELECT devicestatus.dev_id, devicestatus.dev_name as 'dev_name', UNIX_TIMESTAMP(CONVERT_TZ(D0.V_CONSO_meter_logdate, '+00:00', @@session.time_zone)) * 1000 as meter_unix_logdate, D0.V_CONSO_meter_value - D1.Index_PD as conso_day FROM devicestatus LEFT JOIN V_CONSO_DAY D0 ON D0.V_CONSO_meter_devlog_id = devicestatus.dev_id LEFT JOIN ( SELECT V_CONSO_meter_devlog_id, V_CONSO_meter_logdate, V_CONSO_meter_value as Index_PD FROM V_CONSO_DAY ) D1 ON D1.V_CONSO_meter_devlog_id = D0.V_CONSO_meter_devlog_id AND D1.V_CONSO_meter_logdate = ( SELECT max(D2.V_CONSO_meter_logdate) FROM V_CONSO_DAY D2 WHERE D2.V_CONSO_meter_devlog_id = D0.V_CONSO_meter_devlog_id AND D2.V_CONSO_meter_logdate < D0.V_CONSO_meter_logdate ) WHERE D0.V_CONSO_meter_devlog_id = 7 AND D0.V_CONSO_meter_logdate > (NOW() - INTERVAL 7 DAY)
J'ai tenté de modifier cette requête mais sans succès, je n'ai clairement pas les compétences.
Si quelqu'un veut bien m'aider.
Partager