我有一个带有两个列的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函数作为替代方案,如果失败。 [/编辑

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top