C# 通过指定可变时间间隔获取聚合数据

C# 通过指定可变时间间隔获取聚合数据,c#,sql,sql-server,asp.net-mvc-4,aggregate-functions,C#,Sql,Sql Server,Asp.net Mvc 4,Aggregate Functions,我的数据库中确实有一个存档表,其中包含数百万个日期时间/值对。现在,我需要使用javascript图表在网页上提供这些数据 由于数据量巨大,我需要实现某种延迟加载和数据聚合。在客户端,一切都很顺利(使用模拟聚合数据)——缺少的是提供数据的服务器端SQL查询 确切地说:我想知道如何通过指定一个可变的时间量(例如,以分钟为单位)来查询数据,其中结果为该时间间隔提供了最小值、最大值和平均值 目前,我正在使用这段代码,它以每小时为单位提供所需的数据: SELECT CAST(DATEADD(hour,F

我的数据库中确实有一个存档表,其中包含数百万个日期时间/值对。现在,我需要使用javascript图表在网页上提供这些数据

由于数据量巨大,我需要实现某种延迟加载和数据聚合。在客户端,一切都很顺利(使用模拟聚合数据)——缺少的是提供数据的服务器端SQL查询

确切地说:我想知道如何通过指定一个可变的时间量(例如,以分钟为单位)来查询数据,其中结果为该时间间隔提供了最小值、最大值和平均值

目前,我正在使用这段代码,它以每小时为单位提供所需的数据:

SELECT CAST(DATEADD(hour,FLOOR(DATEDIFF(hour,0,CAST(DateValue AS datetime))),0) as datetime) as d, avg(Value) as Av, min(Value) as Mn, max(Value) as Mx
  FROM [TESTDB].[dbo].[ValueArchive]
  WHERE StationId=5 and DataPointId=21507
  GROUP BY CAST(DATEADD(hour,FLOOR(DATEDIFF(hour,0,CAST(DateValue AS datetime))),0) as datetime)
  order by d
此查询返回如下数据:

Zeit                    Av                  Mn                  Mx
2014-07-31 07:00:00.000 21,5311364673079    21,1000043854118    22,0000043988228
2014-07-31 08:00:00.000 21,5188868579348    21,0000043839216    22,0000043988228
2014-07-31 09:00:00.000 21,5014227301436    10,3                21,9000043973327
2014-07-31 10:00:00.000 21,6056305272473    21,1000043854118    22,200004401803
2014-07-31 11:00:00.000 21,7478380172488    21,300004388392     22,200004401803
2014-07-31 12:00:00.000 21,9086686573894    21,5000043913722    22,4000044047833
2014-07-31 13:00:00.000 22,6290701521411    21,7000043943524    25,2000044465065
2014-07-31 14:00:00.000 24,3890669344227    23,7000044241548    25,1000044450164
2014-07-31 15:00:00.000 23,5097663260819    23,000004413724     24,0000044286251
2014-07-31 16:00:00.000 23,3656704604484    22,9000044122338    23,900004427135
2014-07-31 17:00:00.000 23,3113943797538    22,9000044122338    23,8000044256449
2014-07-31 18:00:00.000 23,3023299996241    22,8000044107437    23,8000044256449
2014-07-31 19:00:00.000 23,3033443003657    22,8000044107437    23,8000044256449
2014-07-31 20:00:00.000 23,265605921441     22,7000044092536    23,8000044256449
2014-07-31 21:00:00.000 23,1962274382304    22,7000044092536    23,8000044256449
2014-07-31 22:00:00.000 23,0771869545565    22,6000044077635    23,5000044211745
2014-07-31 23:00:00.000 22,9476058889577    22,200004401803     23,5000044211745
2014-08-01 00:00:00.000 22,7839329819327    22,3000044032931    23,2000044167042
2014-08-01 01:00:00.000 22,6155113662449    22,0000043988228    23,1000044152141
2014-08-01 02:00:00.000 22,4463981676577    21,9000043973327    22,9000044122338
这是一个很好的开始,但我不知道如何更改此查询,使其以2分钟、15分钟或5秒等间隔工作。间隔开始/结束日期应与整小时对齐,因此,如果查询指定时间范围的10分钟间隔,数据块应包含10:00到10:10的数据,10:10到10:20等(当处理使用相同时间x轴的其他独立数据系列时,此量化非常重要。)

有没有一种方法可以通过使用查询(或存储过程)直接在数据库中实现该功能?还是我必须先获取所有数据,然后在Web服务器上进行聚合


谢谢你的帮助

由于SQL Server中的整数除法将返回一个整数,您可以获得
日期值
和某个历元之间的时间差,将其除以间隔,再乘以间隔,然后将结果转换回日期时间。这将使您的时间间隔与小时对齐(假设您使用的值是等分的;7秒的时间间隔不会对齐,但例如5秒)。在下面的示例中,我使用分钟,但将其更改为秒并不重要:

declare @interval_minutes int = 15
select  dateadd(MINUTE, DATEDIFF(MINUTE, '01-jan-1970', DateValue)/@interval_minutes*@interval_minutes, '01-jan-1970') as d
        avg(Value) as Av,
        min(Value) as Mn,
        max(Value) as Mx
FROM    [TESTDB].[dbo].[ValueArchive]
WHERE   StationId=5 and DataPointId=21507
group by DATEDIFF(MINUTE, '01-jan-1970', DateValue)/@interval_minutes
例如,此SQL:

declare @interval_minutes int = 15
select  dateadd(MINUTE, DATEDIFF(MINUTE, '01-jan-1970', getdate())/@interval_minutes*@interval_minutes, '01-jan-1970') as d
当我在10月28日13:23运行它时,将返回
2014-10-28 13:15:00.000

将间隔更改为30将给出
2014-10-28 13:00:00.000