SQL - Max und Min Zeit zwischen zwei Feldern zu ändern
Frage
Ich habe eine PL / SQL-Tabelle mit zwei Spalten: log_date
(DATE) und value
(FLOAT). Die Daten sind sehr feinkörnig, könnte der Unterschied zwischen log_dates
wenige Millisekunden betragen. Die value
ändert sich im Laufe der Zeit. Ich möchte finden, die mit SQL, die maximale und minimale Menge an Zeit zwischen log_date
s es für value
nimmt zu erhöhen.
Edit: Beispiel
log_date | value
-------------------
15:00 | 10
15:01 | 10
15:02 | 11
15:03 | 11
15:04 | 11
15:05 | 11
15:06 | 12
Zwischen 15.00 Uhr und 15.02 value
erhöht, sondern es auch von 15.03 bis 15.06 Uhr erhöht, die länger dauerte, und so mag ich eine Abfrage, die (in diesem Fall) zurückkehren würde ‚3 Minuten‘ (wie ein Datum oder eine Zahl.) - die längste Zeit für value
zu diesem Anstieg
Lösung
Ich kann Ihnen eine Antwort in T-SQL geben, aber ich bin nicht sicher, welcher Dialekt Sie verwenden. TBH, hier eine Schleife ist das erste, was in dem Sinne (jemand anderes einen besseren Weg, es zu tun haben!):
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
Auf diese Weise Sie mit einer Tabelle aller Unterschiede am Ende, dass Sie dann Abfrage.
HTH
Andere Tipps
Sie können diese Abfrage verwenden, um die maximalen und minimalen log_date für einen bestimmten Wert zu finden. Aber dafür werden Sie den Wert angeben. Sie könnten die Abfrage ein wenig ändern, wenn Sie es allgemeinere
machen wollenSELECT MAX(log_dates) AS MaxLogDate, MIN(log_dates) AS MinLogDate
FROM yourtable
WHERE <ANY condition IF needed>
GROUP
BY VALUE
HAVING VALUE = <specify VALUE>;
Versuchen Sie so etwas wie die folgenden:
select top 1 * from
(
select
max(log_date) - min(log_date) as duration,
value
from logdata
group by value
)
order by duration asc
und die asc für den anderen Wert absteigend ändern.
[Bearbeiten] Das kann ich im Moment nicht wirklich testen, so dass ich nicht sicher bin, ob die max-min arbeiten, können Sie die datediff Funktion in einer der anderen Antworten als Alternative gepostet verwenden, wenn dies nicht gelingt. [/ Edit]