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。可是如何实现呢?不知道我表达清楚了没有,在线等

解决方案 »

  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 行受影响)
      

  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
      

  3.   

    DECLARE @a table(A varchar(20), B char(2), C varchar(20))
    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 行)*/
      

  4.   

    多谢多谢!问题果然得到解决,但是现在还有一点,就是我想以
    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 子句,那么前一个语句必须以分号结尾。
      

  5.   

    加个;
    ;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
      

  6.   

    数据库是2005的,另外7楼的朋友:加“;”不行啊,加上去提示
    ';' 附近有语法错误。
    我想这样(如下),但是不行啊
    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