select a.* 
from 临时表 a left join(
select 疫苗编码,疫苗剂次=max(疫苗剂次)+1
from 临时表
where 状态='已种'
group by 疫苗编码
)b on a.疫苗编码=b.疫苗编码
where a.疫苗剂次<=isnull(b.疫苗剂次,(
select min(疫苗剂次) from 临时表
where 疫苗编码=a.疫苗编码))

解决方案 »

  1.   

    --测试--测试数据
    create table 临时表(疫苗编码 varchar(10),疫苗剂次 int,状态 varchar(4))
    insert 临时表 
          select 'A', 1, '未种'
    union select 'B', 1, '已种'
    union select 'B', 2, '未种'
    union select 'B', 3, '未种'
    union select 'C', 1, '未种'
    union select 'C', 2, '未种'
    union select 'D', 1, '未种'
    union select 'D', 2, '已种'
    union select 'D', 3, '未种'
    union select 'D', 4, '未种'
    goselect a.* 
    from 临时表 a left join(
    select 疫苗编码,疫苗剂次=max(疫苗剂次)+1
    from 临时表
    where 状态='已种'
    group by 疫苗编码
    )b on a.疫苗编码=b.疫苗编码
    where a.疫苗剂次<=isnull(b.疫苗剂次,(
    select min(疫苗剂次) from 临时表
    where 疫苗编码=a.疫苗编码))
    go--删除测试
    drop table 临时表/*--测试结果
    疫苗编码       疫苗剂次        状态   
    ---------- ----------- ---- 
    A          1           未种
    B          1           已种
    B          2           未种
    C          1           未种
    D          1           未种
    D          2           已种
    D          3           未种(所影响的行数为 7 行)
    --*/
      

  2.   

    zjcxc(: 邹建 :) 大哥!你真是太厉害了!这么快就解决了!我真是崇拜你啊!我先好好看看你的语句!
      

  3.   

    最后这个条件我不明白,能给解释一下吗?where a.疫苗剂次<=isnull(b.疫苗剂次,(
    select min(疫苗剂次) from 临时表
    where 疫苗编码=a.疫苗编码))
      

  4.   

    如果b.疫苗剂次是NULL的话,表示它没有没有已种记录这句就是取第一个未种记录
    select min(疫苗剂次) from 临时表
    where 疫苗编码=a.疫苗编码))