2010-11-11 2 views
1

У меня есть таблица PL/SQL с двумя столбцами: log_date (DATE) и value (FLOAT). Данные очень мелкозернистые, разница между log_dates может составлять несколько миллисекунд. value изменяется со временем. Я хочу найти, используя SQL, максимальный и минимальный промежуток времени между log_date s требуется для value для увеличения.SQL - максимальное и минимальное время между двумя полями

Edit: Пример

log_date | value 
------------------- 
    15:00 | 10 
    15:01 | 10 
    15:02 | 11 
    15:03 | 11 
    15:04 | 11 
    15:05 | 11 
    15:06 | 12 

Между 15:00 и 15:02 value увеличилась, но она также увеличилась между 15:03 и 15:06, которое заняло больше времени, и поэтому я хочу запрос, который будет возвращать (в этом случае) «3 минуты» (как ДАТА или НОМЕР) - это самое длинное время, которое потребовалось для увеличения value.

+0

Не могли бы вы разместить образцы данных и ожидаемый результат из этого образца? Я не уверен, что полностью понимаю этот вопрос. –

ответ

0

Я могу дать вам ответ в T-SQL, но я не уверен, что диалект вы используете. ТВН, петля вот первое, что приходит на ум (кто-то еще может быть лучший способ сделать это!):

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 

Таким образом, вы в конечном итоге с таблицей всех различий, которые вы можете затем запрос.

НТН

-1

Вы можете использовать этот запрос для поиска max и min log_date для определенного значения. Но для этого вам нужно будет указать значение. Вы, возможно, придется изменить запрос немного, если вы хотите, чтобы сделать его более универсальным

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

Всегда рассуждайте вниз. И как я узнаю, что вопрос был отредактирован после того, как я ответил. Так много для того, чтобы помочь! – pavanred

+0

Не принимайте это лично - вышеизложенное не отвечает на вопрос, который я задал, вот и все. – Peter

+0

Это классный человек. Будет отредактировать мой ответ, чтобы он соответствовал вашему вопросу, как только я найду какое-то время. – pavanred

0

Попробуйте что-то вроде следующего:

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

и изменить к возрастанию по убыванию Количество на другое значение.

Я не могу проверить это на данный момент, поэтому я не уверен, будет ли работать max-min, вы можете использовать функцию датиффа, опубликованную в одном из других ответов, в качестве альтернативы, если это не удается. [/ edit]

Смежные вопросы