時間間隔に基づくレコードのグループ化


12

次のスキーマのテーブルがあり、時間間隔(例:1分あたりのレコード数)に基づいてデータをグループ化できるクエリを定義し、前のグループ以降のSnapShotValueへの変更の合計を提供する必要があります。現時点では、SnapShotValueは常に増分するため、差分の合計のみが必要です。誰かがこれを行う可能性のあるSQL Server T-SQLクエリを手伝ってくれる?私はスキーマを変更することにオープンですが、これは私が現在持っているものです。

スキーマ

CaptureTime   (datetime)
SnapShotValue (int)

サンプルデータ

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

必要なクエリ結果

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark

回答:


17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

SE-Data

datediff(minute, 0, CaptureTime)からの分数が表示されます1900-01-01T00:00:00

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)以来分の番号を追加1900-01-01T00:00:00する1900-01-01T00:00:00だけで数分で日時で終わります。

1+あなたは次の分をしたかったので、そこにあります。

5分間隔で同じことを行うには、いくつかの計算を行う必要があります。分を除算し5て乗算する5と、分が5分の精度に切り捨てられます。これは、SQL Serverの整数除算の結果が整数であるため機能します。

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

これは答えのための素晴らしいフレームワークを提供しました、しかし私はまだこれがどのように機能するか理解するのに少し問題を抱えています。オフセットを1分間隔から5分間隔に変更しようとした場合でも、1分間隔が得られ、結果全体が別の開始点から始まります。これは、これがどのように機能するかを誤解している可能性が高いです。1分以外の間隔を示すもう1つのサンプルを提供できますか?ありがとう...
JoeGeeky

0

私はそこの3番目の例に少し混乱しています、これは1325であるはずですか?スナップショット値の合計をキャプチャするという要件に基づいて、以下のクエリはあなたが求めているものを取得するはずです。

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))

0

以下は、承認された回答をPostgreSQLに翻訳したものです(2000年1月1日を基準日として選択しました。データがそれよりも古い場合は、より早い日付に変更してください)。

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.