急,求SQL语句(100分)

  • 主题发起人 主题发起人 amourz
  • 开始时间 开始时间
A

amourz

Unregistered / Unconfirmed
GUEST, unregistred user!
编号 类型
1 a
2 a
3 b
4 b
5 a
6 a
7 c
8 c
要求得出如下查询结果
开始编号 截至编号 类型
1 2 a
3 4 b
5 6 a
7 8 c
急求
 
可以不用SQL实现
至于用SQL实现吗,不清楚,关注中
 
drop table #tmp
Create table #Tmp(ID int,code char(1))
INSERT INTO #Tmp values(1,'a')
INSERT INTO #Tmp values(2,'a')
INSERT INTO #Tmp values(3,'b')
INSERT INTO #Tmp values(4,'b')
INSERT INTO #Tmp values(5,'a')
INSERT INTO #Tmp values(6,'a')
INSERT INTO #Tmp values(7,'c')
INSERT INTO #Tmp values(8,'c')



Select Min(开始编号)as 开始编号,结束编号,类型 from
(Select ID as 开始编号
,(Select Top 1 ID from #Tmp where ID>a.ID And code<>a.code Order By ID ) - 1 as 结束编号
,code as 类型 From #Tmp a ) aa
Where 结束编号 is not null
group by 结束编号,类型

查询结果
开始编号 结束编号 类型
1 2 a
5 6 a
3 4 b
 
select a.编号 as 开始编号,b.编号 as 截至编号,a.类型 from table1 a
inner join table1 b on a.类型=b.类型 and a.编号<b.编号
 
SELECT 类型, MIN(编号) 开始编号, MAX(编号) 截至编号
FROM Table
FROUP BY 类型
 
williamlea,和xianguo, 的方法都是错的
我写方法的最后一条记录取不到。。。。。
头疼
 
drop table #tmp
Create table #Tmp(编号 int,类型 char(1))
INSERT INTO #Tmp values(1,'a')
INSERT INTO #Tmp values(2,'a')
INSERT INTO #Tmp values(3,'b')
INSERT INTO #Tmp values(4,'b')
INSERT INTO #Tmp values(5,'a')
INSERT INTO #Tmp values(6,'a')
INSERT INTO #Tmp values(7,'c')
INSERT INTO #Tmp values(8,'c')



Select Min(开始编号)as 开始编号
,结束编号 = case when 结束编号 is null then (Select Max(编号) From #Tmp) else 结束编号 end
,类型 from
(Select 编号 as 开始编号
,(Select Top 1 编号 from #Tmp where 编号>=a.编号 And 类型<>a.类型 Order By 编号 ) - 1 as 结束编号
,类型 From #Tmp a ) aa
group by 结束编号,类型
order by 开始编号

结果
1 2 a
3 4 b
5 6 a
7 8 c
哈哈,总算想到了,楼主给分
 
小虫这么写的话,开始编号,还是会出来2,4,6,8的.
不知道楼主的编号是不是都是连续的,有没有可能中间有缺的或者不是按照从小到大的顺序?
 
好像都不能取到正确的数据,to 晚起的小虫,我现在不止8条数据呢,数据量很大的,如果象你的方法,用临时表插入数据,那效率是不是太低了点
 
临时表我只是测试,你当然不须要用临时表呀,你直接用你的表名代替#tmp就行了
我的#tmp只是模仿你的表测试而已

来自:hityou, 时间:2006-6-2 12:06:45, ID:3460166
小虫这么写的话,开始编号,还是会出来2,4,6,8的.
不知道楼主的编号是不是都是连续的,有没有可能中间有缺的或者不是按照从小到大的顺序?

hityou兄,我测试过的,不会出现2,4,6,8的。
如果编号不是连续的话也还是有办法的,不过要麻烦很多
 
select min(convert(int,编号)) as 开始编号,max(convert(int,编号)) as 结束编号,类型 from 表名 group by 类型
 
SELECT A.开始编号, B.截至编号, A.类型 FROM
(SELECT 类型, MIN(编号) 开始编号 FROM Table GROUP BY 类型) A,
(SELECT 类型, MAX(编号) 截至编号 FROM Table GROUP BY 类型) B
WHERE A.类型 = B.类型

没测试过, 试试看.
 
to 小虫:
呵呵,我当时看到的不是这个,你后来修改了把?,这个应该没问题.
 
to amourz:
我的难道不正确?应该没问题啊,你试了吗/
 
自己多想想,不难的东西
 
to hityou
呵呵,我是改的,当时写,当时我也觉得不对就改了,凑巧,呵
 
来自:gcyzyw, 时间:2006-6-2 15:07:25, ID:3460366
to amourz:
我的难道不正确?应该没问题啊,你试了吗/

我代楼主回答你,你的是错了,不符合楼主要求,我测了的
 
drop table #tmp
Create table #Tmp(编号 int,类型 char(1))
INSERT INTO #Tmp values(1,'a')
INSERT INTO #Tmp values(2,'a')
INSERT INTO #Tmp values(3,'b')
INSERT INTO #Tmp values(4,'b')
INSERT INTO #Tmp values(5,'a')
INSERT INTO #Tmp values(6,'a')
INSERT INTO #Tmp values(7,'c')
INSERT INTO #Tmp values(8,'c')
INSERT INTO #Tmp values(10,'d')

Select Min(开始编号)as 开始编号
,结束编号 = case when 结束编号 is null then (Select Max(编号) From #Tmp) else 结束编号 end
,类型 from
(Select 编号 as 开始编号
,(Select top 1 c.编号 from #Tmp c INNER JOIN
(Select Top 1 编号 from #Tmp where 编号>a.编号 And 类型<>a.类型 Order By 编号 ) b
on c.编号<b.编号 Order By c.编号 desc) as 结束编号
,类型 From #Tmp a ) aa
group by 结束编号,类型
order by 开始编号

这个是如果编号有断码的写法
结果
1 2 a
3 4 b
5 6 a
7 8 c
10 10 d
 
谢谢各位,问题解决了,晚起的小虫的不错
 
后退
顶部