SQL - Max y Min tiempo entre dos campos cambiantes
Pregunta
Tengo una tabla PL / SQL con dos columnas: log_date
(FECHA) y value
(float). Los datos son de grano muy fino, la diferencia entre log_dates
podría ser de unos pocos milisegundos. El value
cambia con el tiempo. Quiero encontrar, utilizando SQL, la cantidad máxima y mínima de tiempo entre log_date
s que tarda value
a aumentar.
Edit: Ejemplo
log_date | value
-------------------
15:00 | 10
15:01 | 10
15:02 | 11
15:03 | 11
15:04 | 11
15:05 | 11
15:06 | 12
Entre las 15:00 y las 15:02 value
aumentado, pero también aumentó 15:03-15:06 que tuvo más tiempo, y por eso quiero una consulta que devolvería (en este caso) '3 minutos' (como una fecha o un número) -. la mayor cantidad de tiempo que le tomó a value
al aumento
Solución
Te puede dar una respuesta en T-SQL, pero no estoy seguro de qué dialecto que está utilizando. TBH, un bucle aquí es la primera cosa que viene a la mente (otra persona pueden tener una mejor forma de hacerlo!):
DECLARE @temp TABLE ( log_date DATETIME, value FLOAT )
INSERT INTO @temp ( log_date, value ) SELECT log_date, value FROM <MyTableName>
DECLARE @diff TABLE ( time_diff INT, old_value FLOAT, new_value FLOAT )
-- the loop
DECLARE @prev_value FLOAT,
@cur_value FLOAT,
@prev_log_date DATETIME,
@cur_log_date DATETIME
WHILE EXISTS ( SELECT NULL FROM @temp )
BEGIN
SELECT TOP 1 @cur_log_date = log_date, @cur_value = value
FROM @temp
ORDER BY log_date
IF ( @prev_value IS NOT NULL AND @prev_log_date IS NOT NULL )
BEGIN
INSERT INTO @diff ( time_diff, old_value, new_value )
SELECT DATEDIFF('ms', @prev_log_date, @cur_log_date ),
@prev_value, @cur_value
END
SELECT @prev_log_date = @cur_log_date, @prev_value = @cur_value
DELETE FROM @temp WHERE log_date = @cur_log_date
END
SELECT MAX(time_diff), MIN(time_diff) FROM @diffs
De esta manera, usted termina con una tabla de todas las diferencias que pueda luego consulta.
HTH
Otros consejos
Puede utilizar esta consulta para encontrar la log_date máximo y mínimo para un valor específico. Pero para ello tendrá que especificar el valor. Puede que tenga que modificar la consulta un poco si quieres que sea más genérico
SELECT MAX(log_dates) AS MaxLogDate, MIN(log_dates) AS MinLogDate
FROM yourtable
WHERE <ANY condition IF needed>
GROUP
BY VALUE
HAVING VALUE = <specify VALUE>;
Trate algo como lo siguiente:
select top 1 * from
(
select
max(log_date) - min(log_date) as duration,
value
from logdata
group by value
)
order by duration asc
y cambiar el ASC para la descripción para el otro valor.
[editar] En realidad no puedo probar esto en el momento, así que no estoy seguro de si el max-min va a funcionar, puede utilizar la función DateDiff publicado en una de las otras respuestas, como alternativa, si esto falla. [/ Editar]