Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318952
  • 博文数量: 61
  • 博客积分: 1445
  • 博客等级: 上尉
  • 技术积分: 435
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-08 16:04
文章分类

全部博文(61)

文章存档

2010年(61)

分类: Oracle

2010-02-06 02:06:17

今天小弟下班回来问我一个功能如何实现,大至是这样 cardIDStart cardIDEnd 1 10 50 60 30 40 100 200 70 90 数据库为sqlserver 2005,现要求给定一个数,如9,则自动形成一个区间段,已分配的号段其实并不是连续的,这样现在指定要一个连续9个连号的区间段,要求从原来凌乱的号段中找最小的未分配的号段给这个区间,如上面的例中中,需要得到最小的9个未分配的连号区间,那么查出来的结果应当是把11至19这段区间分配出来。 小弟说他一个同事,在写存储过程实现这个功能,好像写了很久,现在还在测试。我觉得这功能没有那么麻烦,应当直接写SQL语句就能搞定,经过一小会,终于是搞定了,请看下面这段SQL。 select top 1 c.cardIDEnd+1 cardIDStart,c.cardiDend+9 cardIDEnd from (select a.CardIDEnd,b.CardIDStart,b.CardIDStart - a.CardIDEnd diff from (SELECT [CardIDStart] ,[CardIDEnd] ,row_number() over (order by cardidstart) rownum FROM [Winapp].[dbo].[ECARD_CARD_USER_CARDID]) a, (SELECT [CardIDStart] ,[CardIDEnd] ,row_number() over (order by cardidstart) rownum FROM [Winapp].[dbo].[ECARD_CARD_USER_CARDID]) b where a.rownum = b.rownum -1 ) c where c.diff>9 order by c.diff 这个方法不一定是最好的,但不管怎么样,还是实现了功能,而且还知道了sqlserver里可以按某个字段排序后可以形成一个排序编号,如row_number() over (order by cardidstart) rownum
阅读(1211) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~