TABLE是这样的
A B C
00001 01 aaa
00001 02 bbb 00002 01 www
00002 02 yyy
00002 03 ttt
00002 04 bbb
.............我想实现:当A列为相同的数值的条件下(如00001或00002),C列里面的bbb的上一行的B列值是多少?(所谓的上一行就是以B列排序的上一行)举例来说,此TABLE为记录产品加工流程的表(A为产品,B为加工流水号,C为加工名)。我想知道在加工到bbb的时候,在bbb前面的那个加工流水号是多少?我是这么想的,如果要实现这个要求,那首先由bbb找到对应的那个B列的号,然后再根据B列这个号减去1。可是如何实现呢?不知道我表达清楚了没有,在线等
A B C
00001 01 aaa
00001 02 bbb 00002 01 www
00002 02 yyy
00002 03 ttt
00002 04 bbb
.............我想实现:当A列为相同的数值的条件下(如00001或00002),C列里面的bbb的上一行的B列值是多少?(所谓的上一行就是以B列排序的上一行)举例来说,此TABLE为记录产品加工流程的表(A为产品,B为加工流水号,C为加工名)。我想知道在加工到bbb的时候,在bbb前面的那个加工流水号是多少?我是这么想的,如果要实现这个要求,那首先由bbb找到对应的那个B列的号,然后再根据B列这个号减去1。可是如何实现呢?不知道我表达清楚了没有,在线等
sql 2005create table #tb
(
A char(10),
B char(10),
C char(10)
)insert into #tb
select '00001','01','aaa' union all
select '00001','02','bbb' union all
select '00002','01','www' union all
select '00002','02','yyy' union all
select '00002','03','ttt' union all
select '00002','04','bbb'with cte as
(
select row_number() over(order by A,B) as num,* from #tb
)select a.A,a.B,a.C from
cte a join cte b on a.num +1 = b.num
where b.c = 'bbb'A B C
---------- ---------- ----------
00001 01 aaa
00002 03 ttt (2 行受影响)
漏加了一个条件
这样的
with cte as
(
select row_number() over(order by A,B) as num,* from #tb
)select a.A,a.B,a.C from
cte a join cte b on a.num +1 = b.num
where b.c = 'bbb' and a.A = b.A
insert @a select '00001', '01', 'aaa'
union all select '00001', '02', 'bbb'
union all select '00002', '01', 'www'
union all select '00002', '02', 'yyy'
union all select '00002', '03', 'ttt'
union all select '00002', '04', 'bbb'SELECT a,v=(SELECT TOP 1 c FROM @a WHERE a=a.a AND b<a.b ORDER BY b desc) FROM @a a WHERE c='bbb'--result
/*
a v
-------------------- --------------------
00001 aaa
00002 ttt(所影响的行数为 2 行)*/
with cte as
(
select row_number() over(order by A,B) as num,* from #tb
)select a.A,a.B,a.C from
cte a join cte b on a.num +1 = b.num
where b.c = 'bbb' and a.A = b.A
作为一个table来查询,例如:select * from ......
但是却提示如下,这是为什么呢?
消息 156,级别 15,状态 1,第 3 行
关键字 'with' 附近有语法错误。
消息 319,级别 15,状态 1,第 3 行
关键字 'with' 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。
;with cte as
(
select row_number() over(order by A,B) as num,* from #tb
)select a.A,a.B,a.C from
cte a join cte b on a.num +1 = b.num
where b.c = 'bbb' and a.A = b.A
';' 附近有语法错误。
我想这样(如下),但是不行啊
select * from
(with cte as
(
select row_number() over(order by A,B) as num,* from #tb
)select a.A,a.B,a.C from
cte a join cte b on a.num +1 = b.num
where b.c = 'bbb' and a.A = b.A) AAA