質問

以下のTable1からの時差の平均を取得したいと思います。値は連続しておらず、時には時間値が繰り返されるため、1)時間ごとに並べ替える必要があります。値。さらに5)_timestamp> = '20091220 11:59:56.1'および_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

役に立ちましたか?

解決

これが機能し、醜いものではありません:

;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)

他のヒント

ステップ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;

まだテストされていないが、理論的には、うまくいくべきだと思う。

あなたが望むものに関する私の仮定が正しい場合、私はそれをする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

結局のところ、平均差は、合計差を単に分割した分割数で割ったものです。

それによって制限する場合は、日付範囲の条項を追加する必要があります。2回目のクエリでは、ゼロで分割する可能性を説明する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top