SQlServer的统计问题 (50分)

  • 主题发起人 主题发起人 luckchen8256
  • 开始时间 开始时间
L

luckchen8256

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟正在作一个雨量统计的程序,有一个功能是以分钟或小时为单位统计出一年
内某一时间段的最大雨量及其时间!
表(JL90098623_2002)结构如下:
ID CTIME DEGREE
1 2002-01-01 08:05:00 2
2 2002-01-02 08:10:00 2
3 2002-01-03 08:15:00 2.5
.
105120 2003-01-01 08:00:00 2
如10分钟的雨量就是相邻两条记录的雨量相加
现在要作的是统计出最大值,和这个最大值包含时段的最小时间:
1+2 2002-01-01 08:05:00 4
2+3 2002-01-02 08:10:00 4.5
...
 
你的问题已经超过了SQL语句管理执行的极限了
如果你只要求获取单位时间内测量记录中的最大值和最小值,一条sql语句就可以做到的
select id, ctime, max(degree),min(degree) from ...... group by id, ctime
但是你的要求要复杂许多,要10分钟或者15分钟等等及某一个时间段,这样,sql语句就做不到了,
你要实现这个功能,就必须这样干:
建立一个临时表,先做累加和,把相邻的两条记录加在一起,写入临时表,
再用我前面的sql语句查询你想要的结果。
而且做累加和也不能用sql语句写出来的,要在程序中自己判断要加几条记录的和,
用循环写入临时表。
只有这个办法,快动手去干吧。
 
这个办法我已经试过了,但是效率实在是太低了,所以想问一下有没有更好
的办法
 
俺也只想到楼上说的,
//看看大虾们怎么说。关注此题。
 
没有办法,只此一解
 
谢谢楼上的朋友!
但是用户是不会接受这么慢的速度的!(我都无法接受)
请各位路过的朋友帮帮忙!!
谢谢
 
首先,要使用存储过程。建立临时表。(速度上应该可以接受)
对于表的要求:ID,用聚集索引,并且,连续。
语句:
create procedure xxxxxx(存储过程名) @canshu1(表中最小ID) int,@canshu2(相加记录数) int,
@canshu3(表中最大ID) int
as
declare @i int
declare @b int
set @i=@canshu1+@canshu2
while @i<=@canshu3
begin
select @b=sum(DEGREE) from JL90098623_2002 where ID>=@canshu1 and ID<=@i
insert into xxxxx(临时表) (列) values(@b) //(其它有用数据再想想办法)
set @sanshu1=@i
set @i=@canshu1+@canshu2
end

调用
exec xxxxxx(存储过程名) 1,2 //(使用你的举例)
 
到CSDN上问到了个好办法:)
select top 1 min(a.ctime) as ctime,sum(b.DEGREE) as DEGREE
from JL90098623_2002 a,JL90098623_2002 b
where b.id between a.id and a.id + [red]n[/red]
group by a.id order by degree desc,ctime
 
多人接受答案了。
 
后退
顶部