1

我有一个包含两列的 PL/SQL 表:log_date(DATE)和value(FLOAT)。数据非常细粒度,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

4

3 回答 3

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 函数作为替代方法。[/编辑]

于 2010-11-11T10:22:10.450 回答
0

您可以使用此查询来查找特定值的最大和最小 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>;
于 2010-11-11T09:16:19.487 回答
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

这样,您最终会得到一个包含所有差异的表,然后您可以查询该表。

高温高压

于 2010-11-11T09:17:03.187 回答