web-dev-qa-db-ja.com

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

次のスキーマのテーブルがあり、時間間隔に基づいてデータをグループ化できるクエリを定義する必要があります(Ex.records per minute)。そして、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
12
JoeGeeky
_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+_は、次の1分間が欲しいためにあります。

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

_dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)
_
17
Mikael Eriksson

私はそこの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
WT_W

以下は、受け入れられた回答を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' 
0
LoMaPh