2016-08-23 48 views
-1

樣本數據的平均值:(SQL)SELECT與間隔

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

當然,日子是一件單獨的事情(很容易)。如果你想讓它在一個小時內開始,這是一個簡單的解決方案。唯一的問題是你的結果不會是3,8。它會是2,7,10,因爲你的數據的第10行將是新的5分鐘的開始。我會在下面提供一個答案,告訴你我的意思 –

回答

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

Rich,其實就是這樣!但第一次應該是2016-01-01 08:33:00.000,因爲那是前5個數據集的中間(日期)。 – Killcycle

+0

我剛剛更新了我的答案,請看一下,看看它是你的。 –

+0

差不多。第二個時間段是08:37:00而不是08:37:00,因爲它是從ID5到ID9。這是最後一個難點:) – Killcycle

0

由五個聚合計算從時間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,它將按預期工作。即:group by(datediff(minute,0,d)-1)/ 5 – dean