Imaginémonos un programa que almacena periódicamente valores en una base de datos, dichos valores pueden ser temperatura, humedad, uso de CPU, voltaje, corriente, intensidad de luz, etc. En definitiva, parámetros que varían con el tiempo, con la característica de que, dos muestras seguidas pueden ser iguales, y no nos interesaría obtenerlas, pero tras una variación sí que nos interesaría volver a ver el mismo valor. Por ejemplo, en una tabla de uno de CPU vemos:
Id | Date | CPU Use | 1 | 5-jun-2013 10:44:20 | 56% | 2 | 5-jun-2013 10:45:50 | 57% | 3 | 5-jun-2013 10:47:20 | 57% | 4 | 5-jun-2013 10:48:50 | 57% | 5 | 5-jun-2013 10:50:20 | 58% | 6 | 5-jun-2013 10:51:50 | 58% | 7 | 5-jun-2013 10:53:20 | 56% | 8 | 5-jun-2013 10:54:50 | 55% | 9 | 5-jun-2013 10:56:20 | 56% | 10 | 5-jun-2013 10:57:50 | 56% | 11 | 5-jun-2013 10:58:20 | 59% | 12 | 5-jun-2013 11:00:50 | 59% |
Cuando en realidad lo que nos interesaría ver es:
Id | Date | CPU Use | 1 | 5-jun-2013 10:44:20 | 56% | 2 | 5-jun-2013 10:45:50 | 57% | 5 | 5-jun-2013 10:50:20 | 58% | 7 | 5-jun-2013 10:53:20 | 56% | 8 | 5-jun-2013 10:54:50 | 55% | 9 | 5-jun-2013 10:56:20 | 56% | 11 | 5-jun-2013 10:58:20 | 59% |
Por tanto tenemos dos formas de abordar el tema:
Evitando introducir valores repetidos
Para ello, bastaría con introducir un trigger en la base de datos asociado a la introducción de los valores en dicha tabla. Imaginemos que la base de datos es «System» y la tabla «CPU»:
1 2 3 4 5 6 7 8 9 10 | DELIMITER $$ DROP TRIGGER IF EXISTS System.no_repeat_insert $$ CREATE TRIGGER System.no_repeat_insert BEFORE INSERT ON System.CPU FOR EACH ROW BEGIN SELECT CPU_Use INTO @Last_value FROM System.CPU WHERE Id=LAST_INSERT_ID(); IF @Last_value = NEW.CPU_Use THEN SET NEW='Error: Consecutive repeat'; END IF; END $$ DELIMITER ; |
De esta forma, evitaremos que se inserten valores repetidos, eso sí, necesitamos que Id, aumente con AUTO_REPEAT, para que la función LAST_INSERT_ID() funcione correctamente.
De esta forma ahorraremos memoria, ya que si tomamos muchas muestras, la información que se genera será enorme.
Directamente en el SELECT
Si en la tabla, tenemos la información repetida, y no nos importa que esté repetida, sólo queremos que el SELECT nos devuelva la información como nosotros la queremos, podemos hacerlo de la siguiente manera:
1 2 |
Así, sólo listaremos los valores, cuya fila anterior no coincida con el valor actual.
Muchas gracias a @darkhert por la sugerencia !!!
Pingback: Bitacoras.com /
I really like the way that you have expressed yourself. There is a lot to be admired from this post. You might want to click on
Top Gun Leather Jacket