示例数据:
例如,我想每5分钟选择一次平均值。
结果应该是这样的列表:
3
8
此功能应为:AVG(VALUE), DATEDIFF(datepart, startdate, enddate) with datepart=minute and/or DATEADD (datepart, number, date)
我没有找到间隔函数(Transact-SQL)
更新
我真正想要做的事情的例子:
我希望点之间的平均值绘制趋势线我必须更改“群集”表示计算它的分辨率。在这个例子中,我的簇是1. 2意味着,我将从前3个值点获得平均值。我希望我确实解释得很好!
答案 0 :(得分:1)
如果您希望您的时间间隔从小时开始,那么这是一个非常简单的解决方案。
样本数据
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
答案 1 :(得分:0)
计算从时间0开始的分钟差异,然后除以5进行汇总:
select min(date), avg(value)
from t
group by (datediff(minute, 0, date) - 1) / 5; -- SQL Server does integer division