1

log_date(DATE)とvalue(FLOAT)の2つの列を持つPL/SQL表があります。データは非常にきめ細かく、その差は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分」(DATEまたはNUMBERとして)を返すクエリが必要です。 )-増加するのにかかった最長の時間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が機能するかどうかはわかりません。これが失敗した場合は、他の回答の1つに記載されている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

このようにして、クエリできるすべての違いのテーブルができあがります。

HTH

于 2010-11-11T09:17:03.187 に答える