web-dev-qa-db-ja.com

2行間の時間差を計算する

次を含むテーブルがあります。

DataDate                 Value
2010-03-01 08:31:32.000  100
2010-03-01 08:31:40.000  110
2010-03-01 08:31:42.000  95
2010-03-01 08:31:45.000  101
.                        .
.                        .
.                        .

値の列に現在の行と前の行の時間差を掛けて、1日の合計を合計する必要があります。

現在、10秒ごとにデータが設定されているため、クエリで簡単に変換できます。

SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate

@startDateと@endDateは、今日の00:00:00と11:59:59の日付です。

データが10秒ごとに収集されるように設定する前に、値が変更されるたびに収集されました。時間に関して重複するエントリはありません。最小の時間差は1秒です。

読み取り間の時間間隔がわからない場合に、行間の経過時間を取得するクエリを設定するにはどうすればよいですか?

SQL Server 2005を使用しています。

46
amarcy
WITH    rows AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY DataDate) AS rn
        FROM    mytable
        )
SELECT  DATEDIFF(second, mc.DataDate, mp.DataDate)
FROM    rows mc
JOIN    rows mp
ON      mc.rn = mp.rn - 1

SQL Server 2012+の場合:

SELECT  DATEDIFF(second, pDataDate, dataDate)
FROM    (
        SELECT  *,
                LAG(dataDate) OVER (ORDER BY dataDate) pDataDate
        FROM    rows
        ) q
WHERE   pDataDate IS NOT NULL
133
Quassnoi

副選択を使用しない場合のQuassnoiのクエリの微調整は次のとおりです。

SELECT
      DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM  rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL
4
Helvio