あなたの間隔が時間に開始したい場合は、これはかなりシンプルなソリューションです。
サンプルデータ
IF OBJECT_ID('tempdb..#SampleData') IS NOT NULL DROP TABLE #SampleData
CREATE TABLE #SampleData (ID int identity(1,1), Date datetime, Value int)
INSERT INTO #SampleData (Date, Value)
VALUES
('2016-01-01 08:31:00.000',1.00000)
,('2016-01-01 08:32:00.000',2.00000)
,('2016-01-01 08:33:00.000',3.00000)
,('2016-01-01 08:34:00.000',4.00000)
,('2016-01-01 08:35:00.000',5.00000)
,('2016-01-01 08:36:00.000',6.00000)
,('2016-01-01 08:37:00.000',7.00000)
,('2016-01-01 08:38:00.000',8.00000)
,('2016-01-01 08:39:00.000',9.00000)
,('2016-01-01 08:40:00.000',10.00000)
クエリ
SELECT
dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) Interval
,AVG(sd.Value) AvgResult
FROM #SampleData sd
GROUP BY dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0)
結果
Interval AvgResult
2016-01-01 08:30:00.000 2
2016-01-01 08:35:00.000 7
2016-01-01 08:40:00.000 10
あなたは期間が異なって表示したいなら、あなたはこれを行うことができます。
SELECT
dateadd(minute, (datediff(minute,0,sd.Date)/5 * 5) + 3, 0) Interval
,AVG(sd.Value) AvgResult
FROM #SampleData sd
GROUP BY dateadd(minute, (datediff(minute,0,sd.Date)/5 * 5) + 3, 0)
この結果を得るには、
Interval AvgResult
2016-01-01 08:33:00.000 2
2016-01-01 08:38:00.000 7
2016-01-01 08:43:00.000 10
このクエリを使用して、この間隔のインスタンスの実際の平均を最も近い分に丸めることができます。
SELECT
a.AVGDate
,AVG(sd.Value) AvgResult
FROM #SampleData sd
JOIN
(
SELECT
DATEADD(minute, DATEDIFF(minute,0,DATEADD(s,30,CAST(AVG(CAST(sd.Date AS Float)) AS Datetime))),0) AVGDate
,dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) Interval
FROM #SampleData sd
GROUP BY dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0)
) a
ON dateadd(minute, datediff(minute,0,sd.Date)/5 * 5, 0) = a.Interval
GROUP BY a.AVGDate
結果;
AVGDate AvgResult
2016-01-01 08:33:00.000 2
2016-01-01 08:37:00.000 7
2016-01-01 08:40:00.000 10
時間間隔(08:00、08:05、08:10)は常に開始しますか? –
時間だけでなく、それは私にとっても興味深い日から始まります! – Killcycle
もちろん、日々は別物です(そして簡単です)。 1時間に開始したい場合は、シンプルなソリューションです。唯一の問題は、結果が3、8にならないことです。データの10行目が新しい5分間の開始点になるため、2,7,10となります。私は以下の答えを提供して、私が意味することをあなたに示します –