按时间间隔对数据库进行统计

SeanQ 2009-01-18 11:28:20
数据库中表有三列
ID列,[id] 主键,没有任何意义,数据库自动增长
值列,[value] 类型为float
时间列,[savetime],类型为datatime,对应值列值的时间点
表的记录可能很大,最多一年可以达到60*24*30*365=15,768,000条记录(时间列时间的间隔是一分钟),没有索引
现在要按照给定的时间间隔对表中的值列进行统计,比如说最大值,最小值和平均值,敝人想到的方法就是这样建立SQL查询语句的:
t1,t2分别查询统计的开始时间和结束时间,T查询统计时间间隔
SELECT MAX([value]) FROM tablename where [savetime] >= t1 AND [savetime] < t1+T
SELECT MAX([value]) FROM tablename where [savetime] >= t1+T AND [savetime] < t1+2T
.
.
.
SELECT MAX([value]) FROM tablename where [savetime] >= t1+nT AND [savetime] < t2
我知道这样的方法十分笨拙,效率也比较低下,达不到系统所要求的目标,所以希望能够得到大家的帮组
可能有人提出在时间了上建立索引,但由于不在万不得已的情况下,不能修改表的结构,也没有这个权限
...全文
259 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2009-01-19
  • 打赏
  • 举报
回复
一个按五分钟分段统计的例
create table tb(时间 datetime , 金额 int)
insert into tb values('2007-1-1 10:00:23' , 8 )
insert into tb values('2007-1-1 10:01:24' , 4 )
insert into tb values('2007-1-1 10:05:00' , 2 )
insert into tb values('2007-1-1 10:06:12' , 3 )
insert into tb values('2007-1-1 10:08:00' , 1 )
insert into tb values('2007-1-1 10:12:11' , 5 )
go

--时间段>=10:00:00 and 时间段<10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
count(*) as 行数,
sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120))
/*
时间段 行数 总金额
------------------------------------------------------ ----------- -----------
2007-01-01 10:00:00.000 3 14
2007-01-01 10:05:00.000 2 4
2007-01-01 10:10:00.000 1 5
(所影响的行数为 3 行)
*/

--时间段>10:00:00 and 时间段<=10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
count(*) as 行数,
sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120))
/*
时间段 行数 总金额
------------------------------------------------------ ----------- -----------
2007-01-01 10:00:00.000 2 12
2007-01-01 10:05:00.000 3 6
2007-01-01 10:10:00.000 1 5

(所影响的行数为 3 行)
*/

drop table tb


wsh236 2009-01-19
  • 打赏
  • 举报
回复
dawugui是耶

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧