Publi

MySQL: Listar elementos evitando las repeticiones consecutivas

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:

IdDateCPU Use
15-jun-2013 10:44:2056%25-jun-2013 10:45:5057%35-jun-2013 10:47:2057%45-jun-2013 10:48:5057%55-jun-2013 10:50:2058%65-jun-2013 10:51:5058%75-jun-2013 10:53:2056%85-jun-2013 10:54:5055%95-jun-2013 10:56:2056%105-jun-2013 10:57:5056%115-jun-2013 10:58:2059%125-jun-2013 11:00:5059%

Cuando en realidad lo que nos interesaría ver es:

IdDateCPU Use
15-jun-2013 10:44:2056%25-jun-2013 10:45:5057%55-jun-2013 10:50:2058%75-jun-2013 10:53:2056%85-jun-2013 10:54:5055%95-jun-2013 10:56:2056%115-jun-2013 10:58:2059%

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
SET @Last_value='';
SELECT Id, Date, Current_CPU_Use FROM (SELECT Id,@Last_value as Last_value,@Last_value:=CPU_Use as Current_CPU_Use FROM System.CPU ) AS sub WHERE Current_CPU_Use != Last_value;

Así, sólo listaremos los valores, cuya fila anterior no coincida con el valor actual.

Muchas gracias a @darkhert por la sugerencia !!!

También podría interesarte...

Only 1 comment left Ir a comentario

  1. Pingback: Bitacoras.com /

Leave a Reply