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_dates 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

¿Fue útil?

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]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top