加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

求一句SQL,求连续记录的最大个数

(2010-10-11 16:10:53)
标签:

杂谈

分类: DB

链接:http://topic.csdn.net/u/20100402/17/1565fb1e-f1e0-4961-b0c4-ae41f95c550f.html

大家好,求一句SQL,求连续记录的最大个数
create table #t 
(_id varchar(3), _date int) 

insert #t select '001',20100101 
union all select '001',20100102 
union all select '002',20100103 
union all select '002',20100101 
union all select '002',20100102 
union all select '002',20100104
union all select '001',20100105 
union all select '001',20100106 
union all select '001',20100107 
union all select '002',20100105 
union all select '002',20100107 
union all select '002',20100108 
union all select '003',20100101
union all select '003',20100102
union all select '003',20100104
union all select '003',20100105
union all select '003',20100106
union all select '003',20100108
union all select '003',20100109
union all select '003',20100111

要求: 求出每个ID 的最大连续记录的个数。记录有几百万, 效率要好一点。 谢谢!
结果为:001最大连续为从20100105到20100107,数量为3, 
  002最大连续为从20100101到20100105,数量为5, 
  003最大连续为从20100104到20100106,数量为3
===================
001 3
002 5
003 3
===================
如果不影响效率的话,最好把时间段也带上:
=================================
001 3 20100105 20100107
002 5 20100101 20100105
003 3 20100104 20100106
=================================
要能加条件, 比如查询连续数量大于3的,结果只有一条
======================================
002 5 20100101 20100105

 

 

if OBJECT_ID('tempdb..#t') is not null drop table #t
go
create table #t(_id varchar(3), _date int
insert #t(_id,_date) select '001',20100101 
union all select '001',20100102 
union all select '002',20100103 
union all select '002',20100101 
union all select '002',20100102 
union all select '002',20100104
union all select '001',20100105 
union all select '001',20100106 
union all select '001',20100107 
union all select '002',20100105 
union all select '002',20100107 
union all select '002',20100108 
union all select '003',20100101
union all select '003',20100102
union all select '003',20100104
union all select '003',20100105
union all select '003',20100106
union all select '003',20100108
union all select '003',20100109
union all select '003',20100111


SELECT RN=IDENTITY(INT),* INTO # FROM #T ORDER BY _ID,_DATE

SELECT _ID,MAX(CNT) MAXCNT
FROM (
   
SELECT _ID,COUNT(1) CNT
   
FROM # T
   
WHERE EXISTS(SELECT 1 FROM # WHERE _ID=T._ID AND (_DATE=T._DATE-1 OR T._DATE=_DATE-1))
   
GROUP BY _ID,_DATE-RN
)
AS T
GROUP BY _ID

DROP TABLE #

0

阅读 收藏 喜欢 打印举报/Report
前一篇:linux计划任务
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有