SQL - MAX и MIN время между двумя полями изменения
Вопрос
У меня есть таблица PL / SQL с двумя столбцами: log_date
(Дата) и value
(ПЛАВАТЬ). Данные очень мелкозернистые, разница между log_dates
может быть несколько миллисекундов. То value
меняется со временем. Я хочу найти, используя SQL, максимальный и минимальный промежуток времени между log_date
S требуется для 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, размещенную в одном из других ответов в качестве альтернативы, если это не удается. [/редактировать