点记录表主键 点编号 X    Y
1    AAA    100  100
2    AAA    100  100
3    BBB    1    2
4    CCC    100  100
合理的数据应该是,只要x,y值一样,点编号就应该一样,可能由于某些错误录入,导致4这条记录的编号和1、2不一样现在想以点的x,y值一样的分组,分的组里,所有记录是编号的去除,只留下编号不一样的那些组。

解决方案 »

  1.   


    --> 测试数据:[test]
    if object_id('[test]') is not null 
    drop table [test]
    go 
    create table [test](
    [主键] int,
    [点编号] varchar(3),
    [X] int,
    [Y] int
    )
    insert [test]
    select 1,'AAA',100,100 union all
    select 2,'AAA',100,100 union all
    select 3,'BBB',1,2 union all
    select 4,'CCC',100,100
    go;with t
    as(
    select *,px=row_number()over(partition by [点编号],[X],[Y] order by (select 1))
    from test
    )select [主键],[点编号],[X],[Y] from t where px=1/*
    [主键] [点编号] [X] [Y]
    ------------------------------------
    1 AAA 100 100
    3 BBB 1 2
    4 CCC 100 100
    */
      

  2.   


    --> 测试数据:[test]
    if object_id('[test]') is not null 
    drop table [test]
    go 
    create table [test](
    [主键] int,
    [点编号] varchar(3),
    [X] int,
    [Y] int
    )
    insert [test]
    select 1,'AAA',100,100 union all
    select 2,'AAA',100,100 union all
    select 3,'BBB',1,2 union all
    select 4,'CCC',100,100
    go;with t
    as(
    select *,px=row_number()over(partition by [点编号],[X],[Y] order by (select 1))
    from test
    )select [主键],[点编号],[X],[Y] from t where px=1/*
    [主键] [点编号] [X] [Y]
    ------------------------------------
    1 AAA 100 100
    3 BBB 1 2
    4 CCC 100 100
    */
      

  3.   

    不知道你想要下面的那种--> 测试数据:[tb]
    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO 
    CREATE TABLE [tb]([主键] INT,[点编号] VARCHAR(3),[X] INT,[Y] INT)
    INSERT [tb]
    SELECT 1,'AAA',100,100 UNION ALL
    SELECT 2,'AAA',100,100 UNION ALL
    SELECT 3,'BBB',1,2 UNION ALL
    SELECT 4,'CCC',100,100
    --------------开始查询--------------------------
    --1
    SELECT * FROM [tb] AS t  WHERE 2>(SELECT count(*) FROM tb WHERE t.[X]=[X] AND t.[Y]=[Y] AND t.[点编号]=[点编号])----------------结果----------------------------
    /* 
    主键          点编号  X           Y
    ----------- ---- ----------- -----------
    3           BBB  1           2
    4           CCC  100         100(2 行受影响)
    */
    --1
    SELECT * FROM [tb] AS t  WHERE NOT EXISTS(SELECT 1 FROM tb WHERE t.[X]=[X] AND t.[Y]=[Y] AND t.[点编号]=[点编号] AND [主键]<t.[主键])----------------结果----------------------------
    /*
    主键          点编号  X           Y
    ----------- ---- ----------- -----------
    1           AAA  100         100
    3           BBB  1           2
    4           CCC  100         100(3 行受影响)*/
      

  4.   

    不知道你想要下面的那种[code=SQL]--> 测试数据:[tb]
    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO 
    CREATE TABLE [tb]([主键] INT,[点编号] VARCHAR(3),[X] INT,[Y] INT)
    INSERT [tb]
    SELECT 1,'AAA',100,100 UNION ALL
    SELECT 2,'AAA',100,100 UNION ALL
    SELECT 3,'BBB',1,2 UNION ALL
    SELECT 4,'CCC',100,100
    --------------开始查询--------------------------
    --1
    SELECT * FROM [tb] AS t  WHERE 2>(SELECT count(*) FROM tb WHERE t.[X]=[X] AND t.[Y]=[Y] AND t.[点编号]=[点编号])----------------结果----------------------------
    /* 
    主键          点编号  X           Y
    ----------- ---- ----------- -----------
    3           BBB  1           2
    4           CCC  100         100(2 行受影响)
    */
    --1
    SELECT * FROM [tb] AS t  WHERE NOT EXISTS(SELECT 1 FROM tb WHERE t.[X]=[X] AND t.[Y]=[Y] AND t.[点编号]=[点编号] AND [主键]<t.[主键])----------------结果----------------------------
    /*
    主键          点编号  X           Y
    ----------- ---- ----------- -----------
    1           AAA  100         100
    3           BBB  1           2
    4           CCC  100         100(3 行受影响)*/
    [/code]
      

  5.   

    题目说的时候可能没说清楚,3    BBB    1    2
    这条,因为只有一条,所以它是"合理"的数据而 
    1 AAA 100 100
    2 AAA 100 100
    4 CCC 100 100
    这三条,明明有相同的XY,却有了不同的点编号,这是不合理的数据,应该显示出来。