点记录表主键 点编号 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 AAA 100 100
2 AAA 100 100
3 BBB 1 2
4 CCC 100 100
合理的数据应该是,只要x,y值一样,点编号就应该一样,可能由于某些错误录入,导致4这条记录的编号和1、2不一样现在想以点的x,y值一样的分组,分的组里,所有记录是编号的去除,只留下编号不一样的那些组。
--> 测试数据:[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
*/--不确定这是你要的结果
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]