表A记录:1   开门   
2   开门
3   关门
4   开门
5   开门
6   关门请教是否能查询出改变量,即只过滤出改变过值的相邻记录。结果应如下:
1   开门
3   关门
4   开门
6   关门

解决方案 »

  1.   

    create table A(a int, b varchar(10))
    insert A
    select 1,   '开门' union    
    select 2,   '开门' union 
    select 3,   '关门' union 
    select 4,   '开门' union 
    select 5,   '开门' union 
    select 6,   '关门'select ta.* from A ta where not exists(select 1 from A where a=ta.a-1 and b=ta.b)
                                
    drop table A
      

  2.   

    -- 测试数据
    DECLARE @t TABLE(
    id int, value varchar(10))
    INSERT @t SELECT 1, N'开门'
    UNION ALL SELECT 2, N'开门'
    UNION ALL SELECT 3, N'关门'
    UNION ALL SELECT 4, N'开门'
    UNION ALL SELECT 5, N'开门'
    UNION ALL SELECT 6, N'关门'-- 查询
    SELECT *
    FROM @t A
    WHERE value <> ISNULL((
    SELECT TOP 1 value FROM @t
    WHERE id < A.id
    ORDER BY id DESC), A.value + 'a')-- 结果:
    id          value
    ----------- ----------
    1           开门
    3           关门
    4           开门
    6           关门(4 行受影响)
      

  3.   

    我的方法只要求id唯一, 不要求id连续
      

  4.   

    xyxfly(天使不敢走的路,傻子一步就能跨过去......) ( )的方法好。。清楚。
      

  5.   

    zjcxc(邹建)你的算法真有型~~~~~~~~~~领教了~
      

  6.   

    BINARY_CHECKSUM的用法此函数返回一个根据表达式遍及表的所以行的二进制检查数,此函数检查某个表是否被改变了。binary_checksum(*)可以用来检查修改过的行。 同一行在update后,该行的binary_checksum(*)就不同。
    语法:
    BINARY_CHECKSUM ( * | expression [ ,...n ] )
    说明:
    &#61548; 代表的所有列,此函数忽略不可比较数据类型的字段,不可比较的数据类型有text,ntext,image,cursor,sql_variant的数据类型。
    &#61548; Expression是指针字段的数据类型,忽略不可比较数据类型的字段。
    例如:
    --建立测试环境
    create table CheckRowIsUpdate
    (
    id int
    ,name varchar(20)
    )
    insert into CheckRowIsUpdate
    select 1,'aa' union all
    select 2,'bb' union all
    select 3,'cc' union all
    select 4,'dd'--先将其表的数据插入到虚拟表
    select *,binary_checksum(*) BID into #CheckRowIsUpdate from CheckRowIsUpdate
    --修改表里的数据
    update CheckRowIsUpdate
    set name='checkupdate'
    where id=4
    --显示结果
    --修改前binary_checksum的显示结果
    select * from #CheckRowIsUpdate
    ID name BID
    1 aa 1633
    2 bb 1634
    3 cc 1635
    4 moreupdate 1109795037
    --修改后binary_checksum的显示结果
    select *,binary_checksum(*) BID from CheckRowIsUpdate
    ID name BID
    1 aa 1633
    2 bb 1634
    3 cc 1635
    4 checkupdate 1546011526
    --查询那些行被修改了
    select * from #CheckRowIsUpdate A
    where exists(select top 1 0 from CheckRowIsUpdate where A.ID=ID and binary_checksum(*)<>A.BID)--显示结果
    ID name BID
    4 checkupdate 1546011526 --删除环境
    drop table #CheckRowIsUpdate
    drop table CheckRowIsUpdate
      

  7.   

    感谢各位的指导。
    xyxfly(天使不敢走的路,傻子一步就能跨过去......) 的查询的确是不能解决Id不连续的情况。
    zjcxc(邹建) 的查询完全能滿足要求。