SQL - MAX и MIN время между двумя полями изменения

StackOverflow https://stackoverflow.com/questions/4152781

  •  08-10-2019
  •  | 
  •  

Вопрос

У меня есть таблица PL / SQL с двумя столбцами: log_date (Дата) и value (ПЛАВАТЬ). Данные очень мелкозернистые, разница между log_dates может быть несколько миллисекундов. То value меняется со временем. Я хочу найти, используя SQL, максимальный и минимальный промежуток времени между log_dateS требуется для value увеличивать.

Редактировать: пример

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 увеличивать.

Это было полезно?

Решение

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

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

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

Емкость

Другие советы

Вы можете использовать этот запрос, чтобы найти максимальный и мин 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>;

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

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

и изменить ASC в Desc для другого значения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top