2016-08-23 10 views
-1

サンプルデータとの平均値を選択:(SQL)の間隔

enter image description here

は、私には、例えば、平均値ごとに5分を選択します。このため

3 
8 

関数は次のようになります:AVG(VALUE), DATEDIFF(datepart, startdate, enddate) with datepart=minute and/or DATEADD (datepart, number, date)

私はインターバル機能を見つけられませんでした(のTransact-SQL)

結果は、このようなリストでなければなりませんアップデート

私がここで本当にやりたいことの例:

sample

私は、ポイント間の平均値が、私はそれを計算する決議を意味し、「クラスタ」を変更する必要がトレンドラインをプロットしたいです。この例では、私のクラスターは1です。2は、最初の3つの値点から平均を取得することを意味します。私はそれをうまく説明したと思う!

+0

時間間隔(08:00、08:05、08:10)は常に開始しますか? –

+0

時間だけでなく、それは私にとっても興味深い日から始まります! – Killcycle

+0

もちろん、日々は別物です(そして簡単です)。 1時間に開始したい場合は、シンプルなソリューションです。唯一の問題は、結果が3、8にならないことです。データの10行目が新しい5分間の開始点になるため、2,7,10となります。私は以下の答えを提供して、私が意味することをあなたに示します –

答えて

0

あなたの間隔が時間に開始したい場合は、これはかなりシンプルなソリューションです。

サンプルデータ

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 
+0

リッチ、実際にそれです!しかし、最初の5つのデータセットの中間(日付)であるため、最初は2016-01-01 08:33:00.000でなければなりません。 – Killcycle

+0

私はちょうど私の答えを更新し、見て、それがあなたの後ろであるかどうかを確認しました。 –

+0

ほぼ右。 2番目の時間は08:37:00ではなく08:37:00です(ID5からID9まで)。それは最後の難しい:) – Killcycle

0

は、集約のために5により時間0除算から数分の違いを計算します。

select min(date), avg(value) 
from t 
group by (datediff(minute, 0, date) - 1)/5; -- SQL Server does integer division 
+0

それは私が得るものです。それは間違っている、あなたは分かる? 1 2016-01-01 08:31:00.000 2.500000 2 2016-01-01 08:35:00.000 7.500000 3 2016-01-01 08:40:00.000 10.000000 PS:この回答に次のような投稿があります私のデータをフォーマットするために? :) – Killcycle

+0

は、datediff関数の結果から1を減算するだけで、期待どおりに動作します。すなわち、グループ化する(datediff(分、0、d)-1)/ 5 – dean