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

War es hilfreich?

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

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]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top