SQL - Max et le temps minimum entre les deux champs changer
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_date
s 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
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]