题
我有一个带有两个列的PL/SQL表: log_date
(日期)和 value
(漂浮)。数据非常细粒度, 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
增加。
解决方案
我可以在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
其他提示
您可以使用此查询来查找特定值的最大和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>;
尝试以下内容:
select top 1 * from
(
select
max(log_date) - min(log_date) as duration,
value
from logdata
group by value
)
order by duration asc
并将ASC更改为另一个值。
编辑]我目前无法实际测试,因此我不确定最大值是否可以工作,您可以使用其他答案之一中发布的notatediff函数作为替代方案,如果失败。 [/编辑
不隶属于 StackOverflow