0

SQL でタイムスタンプの行間の平均を見つけることができるかどうか疑問に思っていました。インターネットでいくつかの解決策を見つけました。しかし、私の場合、4 時間以上の差は含めたくありません。MSQLでこれを行うことは可能ですか? たとえば、次のタイムスタンプ:

12-12-12 18:00:00
12-12-12 17:50:00
12-12-12 17:30:00
12-12-12 11:00:00

平均は次のようになります: (20+10)/2=15

これは可能ですか?

前もって感謝します!

4

3 に答える 3

0

アイデアは、任意の行で指定されたタイムスタンプよりも小さい最大のタイムスタンプを見つけることです。これを行う最もSQL互換の方法は、任意のデータベースで機能する相関サブクエリを使用することです。

ただし、タイムスタンプは一般にデータベース間で互換性がなく、差異を取得して定数と比較するための関数は標準ではありません。これがMySQLの1つの方法で、算術演算のためにすべてを秒に変換します。

select avg(TIME_TO_SEC(TIMEDIFF(TimeStamp, prevTimeStamp))
from (select t.*,
             (select max(t2.timestamp) from t t2 where t2.timestamp < t.timestamp) as prevTimeStamp
      from t
     ) t
where TIME_TO_SEC(TIMEDIFF(TimeStamp, prevTimeStamp) < 4*60*60

サブクエリはどのデータベースでも機能するはずです。時間関数はデータベース間で異なります。

于 2012-12-30T14:54:08.250 に答える
0

あなたが持っていると想像してください

12-12-12 18:00:00
12-12-12 17:50:00
12-12-12 17:30:00
12-12-12 11:00:00
12-12-12 10:50:00
12-12-12 10:30:00

4 時間を超える差異を含めたくない場合。どのタイムスタンプを拒否しますか? うーん...すべてのタイムスタンプを含む合計平均を作成できます。次に、その変動を計算し、特定のoutliers. 上の行を見て、外れ値は何でしょう? morning cluster全体または全体を拒否する必要がありますevening cluster。ただし、これら2つのいずれもあなたが望むものではないと確信しています。結果として、rejection criteria 4 時間以上は悪いと考えて、あなたが望むものにとってより意味のあるものを見つける必要があります。

于 2012-12-30T12:10:15.260 に答える
0

あなたは情報に少し恥ずかしがり屋です。より良い視点を得るために、既存のクエリを投稿していただけないでしょうか?

Microsoft SQL について言及していると思います。また、タイムスタンプを相互に関連付ける他の識別子があることを期待しているため、結果セットを制限する方法を決定できるようにします。

私の最初の提案は、ネストされたクエリを使用することです。

--Sample Table
declare @TimeTable table ( RowId int Identity, Stamp datetime)
insert into @TimeTable select '12/1/2012 04:00'
insert into @TimeTable select '12/1/2012 04:30'
insert into @TimeTable select '12/1/2012 05:00'

--Test Query -  Find the next record
select Stamp,
    (
        select top 1 Stamp 
        from @TimeTable t2 
        where RowId > T1.RowId
    ) as CompareDate
from @TimeTable T1

--Test Query - Instead of dates, show difference in minutes
select
    datediff(n,
        Stamp,
            (
            select top 1 Stamp 
            from @TimeTable t2 
            where RowId > T1.RowId
            )
        ) as Mins
from @TimeTable T1

--Finally we average the result of minutes
select avg(AverageTable.Mins)
from 
    (
        select
            datediff(n,
                Stamp,
                    (
                    select top 1 Stamp 
                    from @TimeTable t2 
                    where RowId > T1.RowId
                    )
                ) as Mins
        from @TimeTable T1
    ) as AverageTable
于 2012-12-30T12:32:02.410 に答える