(SQL)选择具有间隔的平均值

(SQL)选择具有间隔的平均值,sql,sql-server,average,Sql,Sql Server,Average,样本数据: 例如,我希望每5分钟选择一次平均值 结果应该是这样的列表: 3 8 用于此操作的函数应该是:AVG(VALUE)、DATEDIFF(datepart、startdate、enddate),其中datepart=minute和/或DATEADD(datepart、number、date) 我没有找到间隔函数(Transact-SQL) 更新 我在这里真正想做的示例: 我想要点之间的平均值来绘制一条趋势线,我必须改变“簇”的意思是计算它的分辨率。在这个例子中,我的集群是1。2意味着

样本数据:

例如,我希望每5分钟选择一次平均值

结果应该是这样的列表:

3
8
用于此操作的函数应该是:
AVG(VALUE)、DATEDIFF(datepart、startdate、enddate),其中datepart=minute和/或DATEADD(datepart、number、date)

我没有找到间隔函数(Transact-SQL)

更新

我在这里真正想做的示例:


我想要点之间的平均值来绘制一条趋势线,我必须改变“簇”的意思是计算它的分辨率。在这个例子中,我的集群是1。2意味着,我将得到前3个值点的平均值。我希望我解释得很好

计算与时间0的差值(以分钟为单位),并除以5进行聚合:

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

如果你想让你的休息时间从小时开始,那么这是一个非常简单的解决方案

样本数据

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)
质疑

结果

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)?不仅仅是小时;从几天开始对我来说也很有趣!当然,日子是另一回事(而且很容易)。这是一个简单的解决方案,如果你想它开始的时间。唯一的问题是你的结果不是3,8。它将是2、7、10,因为数据上的第10行将是新的5分钟周期的开始。我将在下面提供一个答案,告诉你我的意思,你是100%正确的:-)非常好,很乐意帮助。请随意选择对您有用的任何答案。如果有人已经解决了你的问题,那么你也可以将其标记为已接受的答案。这就是我得到的答案。这是错误的,你明白吗?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 P.S.:如何在这篇回答文章中下一行,以格式化我的数据?:)只需从datediff函数的结果中减去1,它就会按预期工作。ie:group by(datediff(分钟,0,d)-1)/5Rich,实际上就是这样!但是没有,第一次应该是2016-01-01 08:33:00.000,因为那是前5个数据集的中间(日期)。我刚刚更新了我的答案,看看是否是你想要的。几乎正确。第二节课是08:37:00而不是08:37:00,因为是从ID5到ID9。最后一个难题是:)@Killcycle如果你能提前提供所有的信息,那就更好了。此外,一旦别人给了你大部分答案,你的好奇心和挑战感会对你的职业生涯有所帮助。我已经用一个子查询更新了我的答案,以计算出间隔内datetime字段的实际平均值。我为此感到内疚……因为我向你发出了挑战。最后只有一个问题:第一个AvgResult应该是3,而不是2。avg()有什么问题?
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