Question

J'ai une table PL / SQL avec deux colonnes: log_date (DATE) et value (FLOAT). Les données sont à grain très fin, la différence entre log_dates pourrait être quelques millisecondes. Le value change au fil du temps. Je veux trouver, en utilisant SQL, le montant maximum et minimum de temps entre log_dates qu'il faut pour value d'augmenter.

Edit: Exemple

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 15:00 et 15:02 value ont augmenté, mais il a également augmenté 15h03-15h06 qui a duré plus longtemps, et donc je veux une requête qui retournerait (dans ce cas) « 3 minutes » (en DATE ou NUMBER) -. le plus long laps de temps qu'il a fallu pour value à l'augmentation

Était-ce utile?

La solution

Je peux vous donner une réponse dans T-SQL, mais je ne suis pas sûr de ce dialecte que vous utilisez. TBH, est la première chose qui vient à l'esprit une boucle ici (quelqu'un d'autre peut avoir une meilleure façon de le faire!):

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 cette façon, vous vous retrouvez avec une table de toutes les différences que vous pouvez alors la requête.

HTH

Autres conseils

Vous pouvez utiliser cette requête pour trouver la log_date max et min pour une valeur spécifique. Mais pour cela, vous devrez spécifier la valeur. Vous pourriez avoir à modifier la requête un peu si vous voulez le rendre plus générique

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

Essayez quelque chose comme ce qui suit:

select top 1 * from
(
  select 
    max(log_date) - min(log_date) as duration,
    value
  from logdata
  group by value
)
order by duration asc

et changer le asc à desc pour l'autre valeur.

[modifier] Je ne peux pas réellement tester ce au moment, donc je ne suis pas sûr si le max-min fonctionne, vous pouvez utiliser la fonction datediff affichée dans l'une des autres réponses comme alternative en cas d'échec. [/ Edit]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top