2

以下の表1からの時間差の平均を取りたいと思います。値は連続しておらず、時折時間値が繰り返されることがあるので、1)時間で並べ替え、2)一意でない値を破棄し、3)時間差(ミリ秒単位)を実行し、4)結果の時間差を平均する必要があります値。さらに、5)datediff操作をWHERE _TimeStamp> = '20091220 11:59:56.1' AND _TimeStamp <= _TimeStamp> = '20091220 11:59:56.8'などの選択した時間範囲に制限したいと思います。私はこれをすべてまとめる方法にかなり困惑しています!

表1:
_TimeStamp
2009-12-20 11:59:56.0
2009-12-20 11:59:56.5
2009-12-20 11:59:56.3
2009-12-20 11:59:56.4
2009-12-20 11: 59:56.4
2009-12-20 11:59:56.9

4

3 に答える 3

1

ステップ1は、一意の時間のみを選択することです。

SELECT DISTINCT _TimeStamp FROM table 
    WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8';

次に、たとえば、すべての時間を互いに比較したい場合(どのように時間を選択したいかわからない場合)、次のようなクレイジーなことを行うことができます。

SELECT t1._TimeStamp, t2._TimeStamp, DATEDIFF(ms,t1._TimeStamp,t2._TimeStamp) FROM 
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t1 
    INNER JOIN
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t2
WHERE t1._TimeStamp != t2._TimeStamp;

私はMySQLから来ているので、構文が間違っている可能性がありますが、同様のことが機能するはずです。

平均が必要な場合は、上記の結果の平均を試してみてください。

SELECT AVG(DATEDIFF(ms,t1._TimeStamp,t2._TimeStamp)) FROM 
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t1 
    INNER JOIN
    (SELECT DISTINCT _TimeStamp FROM table 
        WHERE _TimeStamp >= '20091220 11:59:56.1' AND _TimeStamp <= '20091220 11:59:56.8') AS t2
WHERE t1._TimeStamp != t2._TimeStamp;

まだテストされていませんが、理論的にはうまくいくはずです。

于 2010-01-11T16:56:43.417 に答える
1

あなたが望むものについての私の仮定が正しければ、それを行うには2つの方法があります。

直接的な方法:

SELECT
    AVG(DATEDIFF(ms, T1.my_time, T2.my_time))
FROM
    My_Table T1
INNER JOIN My_Table T2 ON
    T2.my_time > T1.my_time
WHERE
    NOT EXISTS
    (
        SELECT
            *
        FROM
            My_Table T3
        WHERE
            (T3.my_time > T1.my_time AND T3.my_time < T2.my_time) OR
            (T3.my_time = T1.my_time AND T3.my_pk < T1.my_pk) OR
            (T3.my_time = T2.my_time AND T3.my_pk < T2.my_pk)
    )

トリッキーな方法:

SELECT
    DATEDIFF(ms, MIN(my_time), MAX(my_time))/(COUNT(DISTINCT my_time) - 1)
FROM
    My_Table

結局のところ、平均差は、差の合計を分割する分割数で割ったものにすぎません。

それによって制限したい場合は、日付範囲に WHERE 句を追加する必要があり、2 番目のクエリでゼロで除算する可能性を考慮する必要があります。

于 2010-01-11T19:23:04.037 に答える
1

これは機能し、醜くないものです:

;WITH Time_CTE AS
(
    SELECT
        MIN(_Timestamp) AS dt,
        ROW_NUMBER() OVER (ORDER BY MIN(_Timestamp)) AS RowNum
    FROM Table1
    GROUP BY _Timestamp
)
SELECT
    t1.dt AS StartDate,
    t2.dt AS EndDate,
    DATEDIFF(MS, t1.dt, t2.dt) AS Elapsed
FROM Time_CTE t1
INNER JOIN Time_CTE t2
ON t2.RowNum = t1.RowNum + 1

例から次の出力が得られます。

StartDate               | EndDate                 | Elapsed
------------------------+-------------------------+--------
2009-12-20 11:59:56.000 | 2009-12-20 11:59:56.300 | 300
2009-12-20 11:59:56.300 | 2009-12-20 11:59:56.400 | 100
2009-12-20 11:59:56.400 | 2009-12-20 11:59:56.500 | 100
2009-12-20 11:59:56.500 | 2009-12-20 11:59:56.900 | 400

編集:時間範囲を制限したい場合はWHERE _Timestamp BETWEEN @StartDate AND @EndDate、行の前に追加してGROUP BYください。

Edit2:平均が必要な場合は、その最終SELECT t1.dt, ...ステートメントを次のように変更します。

SELECT AVG(DATEDIFF(MS, t1.dt, t2.dt))
FROM Time_CTE t1 ... (same as above)
于 2010-01-11T19:39:35.770 に答える