Υπολογισμός διαφορών μετρήσεων Ηλεκτρικής Κατανάλωσης από πίνακα

Από The Stelios Files


Υπολογισμός διαφορών μετρήσεων Ηλεκτρικής Κατανάλωσης από πίνακα.

1 Τα δεδομένα

Ο πίνακας electricity περιέχει τις μετρήσεις από το ρολόι της ΔΕΗ με την παρακάτω μορφή:

Id  date       m_day   m_night remarks
150 2023-05-13 85710.6 27616.9
149 2023-05-12 85701.9 27613.5
148 2023-05-11 85691.0 27611.0 bill
147 2023-05-10 85680.6 27608.7
146 2023-05-09 85667.0 27606.0
145 2023-05-08 85657.4 27602.8
144 2023-05-07 85649.7 27600.2
143 2023-05-06 85635.5 27596.7

2 Πρώτη προσέγγιση

Με το ακόλουθο script μπορούμε να εμφανίσουμε τις διαφορές των μετρήσεων από την μια καταμέτρηση έως την άλλη:

SELECT 
    t1.date AS Date,
    t1.m_day AS DayR,
    t1.m_day - COALESCE(t2.m_day, t1.m_day) AS Day_diff,
    t1.m_night AS NightR,
    t1.m_night - COALESCE(t2.m_night, t1.m_night) AS Night_diff
FROM
    electricity t1
LEFT JOIN
    electricity t2 ON t1.id = t2.id + 1
ORDER BY t1.date DESC;

Το αποτέλεσμα θα έχει την παρακάτω μορφή:

Date       DayR    Day_diff NightR  Night_diff 
2023-05-13 85710.6 8.7      27616.9 3.4
2023-05-12 85701.9 10.9     27613.5 2.5
2023-05-11 85691.0 10.4     27611.0 2.3
2023-05-10 85680.6 13.6     27608.7 2.7
2023-05-09 85667.0 9.6      27606.0 3.2
2023-05-08 85657.4 7.7      27602.8 2.6
2023-05-07 85649.7 14.2     27600.2 3.5
2023-05-06 85635.5 11.1     27596.7 2.7
2023-05-05 85624.4 6.4      27594.0 2.4

Πρωτεύον κλειδί είναι το πεδίο id, που αυξάνεται αυτόματα κατά ένα με κάθε νέα εγγραφή. Με βάση αυτό γίνεται η ταύτιση μεταξύ της νιοστής και της νιοστής +1 εγγραφής. Εάν για κάποιο λόγο μεταξύ δύο συνεχόμενων ημερολογιακών εγγραφών δεν υπάρχει συνέχεια σε αυτή την αυτόματη αρίθμηση, τότε το εξαγόμενο αποτέλεσμα θα είναι μηδέν. Επιπρόσθετα, εάν η αυτόματη αρίθμηση δεν ταυτίζεται χρονολογικά με τις μετρήσεις, τότε πάλι τα αποτελέσματα θα είναι λανθασμένα.

3 Δεύτερη προσέγγιση

Το ακόλουθο script κάνει χρήση της LAG() συνάρτησης που εντάσσεται στο ευρύτερο πλαίσιο WINDOW της MySQL. Πρωτεύον κλειδί είναι το πεδίο date, θεωρώντας οτι υπάρχει μόνο μια εγγραφή ανά ημερομηνία.

SELECT 	
  date, 
  m_day, 
  m_night,  
  m_day-LAG(m_day) over w  AS cn1, 
  m_night-LAG(m_night) over w  as cn2,
  m_day-LAG(m_day) over w + m_night-LAG(m_night) over w as tl,
  datediff(date, lag(date) over w) as days,
  year(date) as year,
  month(date) as month,
  weekday(date)+1 as weekday,
  remarks
  FROM electricity
WINDOW w AS (ORDER BY date)

Το αποτέλεσμα θα έχει την παρακάτω μορφή:

date        m_day   m_night cn1   cn2  tl   days year month weekday remarks
2023-05-06	85635.5	27596.7	11.1  2.7  13.8	1	 2023 5	    6	
2023-05-07	85649.7	27600.2	14.2  3.5  17.7	1	 2023 5	    7	
2023-05-08	85657.4	27602.8	7.7	  2.6  10.3	1	 2023 5	    1	
2023-05-09	85667.0	27606.0	9.6	  3.2  12.8	1	 2023 5	    2	
2023-05-10	85680.6	27608.7	13.6  2.7  16.3	1	 2023 5	    3	
2023-05-11	85691.0	27611.0	10.4  2.3  12.7	1	 2023 5	    4	    bill
2023-05-12	85701.9	27613.5	10.9  2.5  13.4	1	 2023 5	    5	
2023-05-13	85710.6	27616.9	8.7	  3.4  12.1	1	 2023 5	    6

το παραπάνω είναι πλέον έτοιμο για εισαγωγή σε excel.