- 爱易网页
 
                        - 
                            MSSQL教程
 
                        - 急求一条较难的SQL语句~ 
 
                         
                    
                    
                    日期:2014-05-18  浏览次数:20572 次 
                    
                        
                         急求一条较难的SQL语句~~~~~~在线等~~
 一个test表,字段如下: 
  
 id                        name 
 2                              A 
 3                              A 
 4                              A 
 6                              B 
 8                              C 
 12                           D 
 14                           D 
 15                           E 
 16                           A 
 17                           A 
 18                           B 
 ---------------- 
 显示结果 
 name            最高连续次数 
 A                           3 
 B                           2 
 C                           1 
 D                           2 
 E                           1 
 我要求连续出现次数最高的个数 
 如: 
 A   从id=2到4   连续出现3次 
 A   从id=16到17   出现2次 
 A的最高是3次 
 B   id=6            出现1次 
 B   id=18         出现1次 
 B的最高是1次 
 其它同理
------解决方案--------------------
create table T(id int, name varchar(10)) 
 insert T select 2,           'A ' 
 union all select 3,           'A ' 
 union all select 4,           'A ' 
 union all select 6,           'B ' 
 union all select 8,           'C ' 
 union all select 12,          'D ' 
 union all select 14,          'D ' 
 union all select 15,          'E ' 
 union all select 16,          'A ' 
 union all select 17,          'A ' 
 union all select 18,          'B ' 
  
  
 	select A.name,  
 	起始号=A.id,  
 	终止号=MIN(B.id), 
 	num=( select count(*) from T where id between A.id and min(B.id) ) 
 	from 
 	( 
 	select tmp.* from T as tmp 
 	where not exists(select 1 from T where name=tmp.name and id=(select max(id) from T where id <tmp.id) ) 
 	) as A, 
 	( 
 	select tmp.* from T as tmp 
 	where not exists(select 1 from T where name=tmp.name and id=(select min(id) from T where id> tmp.id) ) 
 	) as B 
 	where A.name=B.name and A.id <=B.id 
 	group by A.name, A.id 
  
 --result 
 name       起始号         终止号         num          
 ---------- ----------- ----------- -----------  
 A          2           4           3 
 B          6           6           1 
 C          8           8           1 
 D          12          14          2 
 E          15          15          1 
 A          16          17          2 
 B          18          18          1 
  
 (7 row(s) affected)
------解决方案--------------------
 
 select name,max(Total) total from 
 ( 
 	select name,min(id) minID,max(id) maxID,count(*) Total from 
 	( 
 		select a.name,a.id,count(*) - sum(case when a.name = b.name then 1 else 0 end) groupid 
 		from z a,z b 
 		where a.id > = b.id 
 		group by a.name,a.id 
 	) t 
 	group by name,groupid