【问题标题】:SQL - Max and Min time between two fields changingSQL - 两个字段之间的最大和最小时间变化
【发布时间】:2011-05-08 08:33:11
【问题描述】:

我有一个包含两列的 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 增加所花费的最长时间。

【问题讨论】:

  • 您能否发布样本数据和该样本的预期输出?我不确定我是否完全理解这个问题。

标签: sql time max min


【解决方案1】:

我可以用 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】:

    您可以使用此查询来查找特定值的最大和最小 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>;
    

    【讨论】:

    • 总是拒绝投票。而且,我怎么知道这个问题在我回答后被编辑了。非常感谢您的帮助!
    • 不要私信——以上没有回答我问的问题,仅此而已。
    • 这很酷。一旦我找到一些时间,将编辑我的答案以适合您的问题。
    【解决方案3】:

    尝试以下方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2022-12-17
      • 2014-01-24
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多