Cálculo del aumento en porcentaje entre dos valores en consulta MySQL

publicado por: Anonymous

En una tabla mysql donde registro, por un lado un volumen, y por otro lado la fecha y hora en que se ha tomado ese registro… no acierto a hacer una consulta mysql que me diga la variación en % del volumen entre la captura más reciente y la de hace X minutos/horas, por ejemplo:

ID    Sujeto  Volumen    Fecha
----  ------  ---------  -------------------
1587  HGT     1651       2018-05-17 09:55:27
1762  HGT     1725       2018-05-17 11:56:54

Partiendo de que en la tabla tengo esos datos puedo sacar el volumen más reciente con:

select volumen from tabla order by id desc limit 1

Y puedo sacar el volumen de hace X minutos con algo como esto:

select volumen from tabla where fecha >= 2018-05-17 09:55:00 order by id asc limit 1

Lo que no acierto es a juntarlo en una misma consulta mysql que me retorne, directamente, que entre esos valores hay una variación de 4.28% en positivo.

solución

La consulta que buscas (actualizado con el comentario en el que dices que sólo deseas calcular el incremento en el registro más actual) es la siguiente:

SELECT
  t.*,
  100 * (Volumen - Volumen_a) / (Volumen + Volumen_a) Subida
FROM (
  SELECT
   *,
   (
     SELECT Volumen
     FROM tabla t_ant
     WHERE
       t_ant.Sujeto = t_act.Sujeto AND t_ant.Id < t_act.Id
     ORDER BY Id DESC
     LIMIT 1
   ) Volumen_a
  FROM tabla t_act
  WHERE Sujeto = 'HGT'
  ORDER BY Fecha DESC
  LIMIT 1
) t
WHERE Volumen_a IS NOT NULL;

La consulta interior obtiene sólo el último registro del sujeto buscado:

SELECT
 *,
 (
   SELECT Volumen
   FROM tabla t_ant
   WHERE
     t_ant.Sujeto = t_act.Sujeto AND t_ant.Id < t_act.Id
   ORDER BY Id DESC
   LIMIT 1
 ) Volumen_a
FROM tabla t_act
WHERE Sujeto = 'HGT'
ORDER BY Fecha DESC
LIMIT 1

A cada registro de esta consulta se le agrega el dato obtenido del registro inmediatamente anterior mediante esta consulta anidada:

SELECT Volumen
FROM tabla t_ant
WHERE
  t_ant.Sujeto = t_act.Sujeto AND t_ant.Id < t_act.Id
ORDER BY Id DESC
LIMIT 1

En la consulta principal se calcula el porcentaje de incremento con la típica fórmula de incremento porcentual:

100 * (FIN - INI) / (FIN + INI)

Con los dos datos de tu ejemplo la salida sería:

Id    Sujeto  Volumen  Fecha                Volumen_a  Subida
1762  HGT     1725     2018-05-17 11:56:54  1651       2.1919

Por último, WHERE Volumen_a IS NOT NULL evita que se muestren los primeros registros, a los que no se les puede calcular el incremento porque no existe un registro anterior.

Puedes ver el funcionamiento en línea en este enlace.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *