Estoy un poco atascado en mi tesis de licenciatura y espero que me puedan ayudar. Para evaluar un sistema fotovoltaico necesito calcular la diferencia entre las cantidades totales de energía. Estos se actualizan automáticamente en una tabla MySQL con una marca de tiempo, pero sin un número de identificación. Necesito obtener el delta/diferencia entre esas cantidades de energía automáticamente como una columna adicional para visualizarlo en Grafana.
****************************************** Timestamp | SB1_AC_Total | Needed information (delta) ****************************************** 2020-06-24 09:32:45 | 11.326.302 | 23 2020-06-24 09:32:02 | 11.326.279 | 22 2020-06-24 09:31:20 | 11.326.257 | ...Esta lista continúa durante semanas. Realmente espero que me puedan ayudar, porque no tengo ni idea y es la primera vez que trabajo con MySQL.
Considere el siguiente código y utilícelo como ejemplo:
create table test (time timestamp, total int); insert into test values (current_timestamp() - interval 2 day, 100); insert into test values (current_timestamp() - interval 1 day, 120); insert into test values (current_timestamp(), 125); select i.*, i.total - t_outer.total as diff from (select t.*, (select max(time) from test t1 where t1.time < t.time) as last_timestamp from test t ) as i left join test t_outer on i.last_timestamp = t_outer.time;Como resultado obtienes algo como:
time total last_timestamp diff "2020-06-23 10:58:21" 120 "2020-06-22 10:58:19" 20 "2020-06-24 10:58:22" 125 "2020-06-23 10:58:21" 5 "2020-06-22 10:58:19" 100 NULL NULLEDITAR:
Si desea colocar el valor de diferencia en una nueva columna de la tabla, puede hacerlo así:
alter table test add column diff int default null; create table select_bkp as -- you know the code below already select i.time, i.total - t_outer.total as diff from (select t.*, (select max(time) from test t1 where t1.time < t.time) as last_timestamp from test t ) as i left join test t_outer on i.last_timestamp = t_outer.time; SET SQL_SAFE_UPDATES = 0; -- so all rows can be updated at once update test t join select_bkp b on t.time = b.time set t.diff = b.diff; SET SQL_SAFE_UPDATES = 1; -- enable secure updatesPude responder a mi pregunta con el siguiente código:
ALTER TABLE TABLENAME ADD SB1_AC_GES_DIFF INT; DELIMITER $$ CREATE TRIGGER TABLENAME_Trigger BEFORE INSERT ON TABLENAME FOR EACH ROW BEGIN DECLARE SB1_AC_GES_old INT; SELECT max(SB1_AC_GES) INTO SB1_AC_GES_old FROM TABLENAME; SET NEW.SB1_AC_GES_Diff = New.SB1_AC_GES - SB1_AC_GES_old; END$$ DELIMITER ;La forma en que aborda esto depende de su conjunto de habilidades con varias herramientas. Yo, por ejemplo, soy viejo en 'C' pero verde en SQL.
Ahora: suponiendo que ya tiene una base de datos y desea crear una nueva con el campo adicional, esta es, en términos generales, cómo lo abordaría.
Cree una nueva base de datos vacía con los campos que desee en ella.
open both databases Read all the old database into a program coded in whatever language you are happy with. Typically you will access this by executing an SQL statement like SELECT * from table1 order by timestamp In general you can now step through the data base line by line. The algorithm you want is this set a variable 'delta' to zero set a variable 'flag to zero while(more lines) read 'timestamp' read 'SB1_AC_Total' write 'timestamp', 'SB1_AC_Total', and 'delta' to the new database using sql INSERT command. If 'flag' is not zero, set 'delta' to ('SB1_AC_Total' - 'old_data'); endif set 'flag' to 1 set a variable 'old_data' to 'SB1_AC_Total' endwhileEsto duplicará la base de datos con una nueva columna cuyo valor es el valor actual menos el valor anterior.
Sospecho que hay una forma de SQL que usa dos selecciones para generar dos tablas temporales y luego lee de una y otra y combina el resultado en una tercera, pero me supera.