高效率的算法
求一个高效率的算法
现有表A(ID varchar(8),DT datetime,P float),primary key(ID,DT) 表记录数有300万
现在求一个ID每一年(表中有记录的年份,如ID=50100100 表A中有记录的年份从1951-2008年)连续3天最大P值和(P为null不参与计算).
附A表一些示例记录
50100100 1951-1-1 2
50100100 1951-1-2 3.5
50100100 1951-1-3 null
.
.
.
50100100 1952-1-1 5
50100100 1952-1-2 7
50100100 1952-1-3 3.3
.
.
.
62012560 .............
高手看看有什么高效的算法!
输出应该是
年份 P和 开始日期
1951
1952
.
.
.
2008
------解决方案--------------------
现有表A(ID varchar(8),DT datetime,P float),primary key(ID,DT) 表记录数有300万
现在求一个ID每一年(表中有记录的年份,如ID=50100100 表A中有记录的年份从1951-2008年)连续3天最大P值和(P为null不参与计算).
附A表一些示例记录
50100100 1951-1-1 2
50100100 1951-1-2 3.5
50100100 1951-1-3 null
.
.
.
50100100 1952-1-1 5
50100100 1952-1-2 7
50100100 1952-1-3 3.3
.
.
.
62012560 .............
高手看看有什么高效的算法!
输出应该是
年份 P和 开始日期
1951
1952
.
.
.
2008
------解决方案--------------------
- SQL code
----生产年份临时表 select 1951 + number as dd into #1 from master.dbo.spt_values where type = 'p' and number <2008 - 1950 --------查询 select dd,max(p) from ( select * from #1 a join 表A b on year(b.dt) = a.dd where exists (select 1 from 表A where dt = b.dt - 1 ) and exists (select 1 from 表A where dt = b.dt - 2 ) and exists (select 1 from 表A where dt = b.dt + 1 ) and exists (select 1 from 表A where dt = b.dt + 2 ) ) T group by dd
------解决方案--------------------
顶。。
------解决方案--------------------
楼上高手都帮顶了..小菜也顶!
------解决方案--------------------
------解决方案--------------------
帮顶
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
是要这样的结果吗?
- SQL code
create table tbA(id varchar(8),dt datetime,p float) insert into tbA select '50100100','1951-1-1',2 union all select '50100100','1951-1-2',3.5 union all select '50100100','1951-1-3',4.2 union all select '50100100','1951-1-4',null union all select '50100100','1951-1-6',7.2 union all select '50100100','1951-1-7',null union all select '50100100','1951-1-8',10.5 union all select '50100100','1952-1-2',5 union all select '50100100','1952-1-3',7 union all select '50100100','1952-1-4',3.3 union all select '50100100','1952-1-5',6.5 union all select '50100100','1952-1-6',1.2 go select datepart(yy,a.dt) as [year],max(a.p+b.p+c.p) as sumP from tbA a inner join tbA b on a.id=b.id inner join tbA c on b.id=c.id where datediff(dd,a.dt,b.dt)=1 and datediff(dd,b.dt,c.dt)=1 and datepart(yy,a.dt)=datepart(yy,b.dt) and datepart(yy,b.dt)=datepart(yy,c.dt) and not a.p is null and not b.p is null and not c.p is null group by datepart(yy,a.dt) go drop table tbA /* year sumP ----------- ---------------------- 1951 9.7 1952 16.8 */
------解决方案--------------------