我有一个包含两列的PL / SQL表:log_date
(DATE)和value
(FLOAT)。数据非常精细,log_dates
之间的差异可能是几毫秒。 value
会随着时间的推移而发生变化。我希望使用SQL查找log_date
增加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
增加所花费的最长时间。
答案 0 :(得分:0)
您可以使用此查询查找特定值的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>;
答案 1 :(得分:0)
我可以在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
这样,您最终会得到一张包含所有差异的表格,然后您可以查询。
HTH
答案 2 :(得分:0)
尝试以下内容:
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是否有效,如果失败,您可以使用其他一个答案中的datediff函数替代。 [/编辑]