我的数据库中有一个存档表,其中包含数百万个日期时间/值对。现在我需要使用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轴。)
有没有办法通过查询(或存储过程)直接在DB中实现该功能?或者我是否必须首先获取所有数据,然后在网络服务器上进行聚合?
感谢您的帮助!
答案 0 :(得分:1)
由于SQL Server中的整数除法将返回一个整数,您可以得到DateValue
和某个纪元之间的时间差,将其除以您的间隔并将其重新乘以您的间隔并将结果转换回日期时间。这将使您的间隔与小时对齐(假设您使用均匀分配的值; 7秒间隔将不对齐,但例如5个seonds)。在下面我使用分钟但是将它改为使用秒数是微不足道的:
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
。