数据比较问题,请教高手

时间:2020-12-21 18:51:54
数据库中有字段A、B、 C、D

如 
A B C D
1 1 2 2
1 1 3 1
1 1 4 5
2 1 2 2
3 3 1 4
3 3 2 3
3 3 3 5
3 1 4 4

现在想查询 所有 A、B都相同的,

14 个解决方案

#1


SELECT * FROM TB where A=B

#2


DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,5 union all
select 3,1,4,4

SELECT * FROM @tab AS t
WHERE t.a=t.b

#3


楼上两位,实在抱歉操作不熟,没写完,抱歉更正如下
数据库中有字段A、B、 C、D

如  
A B C D
1 1 2 2
1 1 3 1
1 1 4 5
2 1 2 2
3 3 1 4
3 3 2 3
3 3 3 5
3 1 4 4

现在想查询 C值比具有相同A、B的其他记录C值大,D值也比其他的大,如红色记录

#4


如 下表中红色两天记录  
A B C D
1 1 2 2
1 1 3 1
1 1 4  5
2 1 2 2
3 3 1 4
3 3 2 3
3 3 3  5
3 1 4 4

#5


借2楼数据


DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,5 union all
select 3,1,4,4

select a,b,max(c) as maxc,max(d) as maxd from @tab 
where a = b
group by a,b


结果

1 1 4 5
3 3 3 5



这样也能得到结果,但是我总感觉缺了点什么。
待验证。

#6


上面的好像不对! 数据比较问题,请教高手

改一下数据就知道了。


DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,3 union all
select 3,1,4,4

select a,b,max(c) as maxc,max(d) as maxd from @tab 
where a = b
group by a,b

结果
1 1 4 5
3 3 3 4

没有第二条数据。

#7


数据可能产生歧义
再描述一下
要求是这样的:
A B C D
1 5 2 2
1 5 3 1
1 5 4 52 1 2 2
3 6 1 4
3 6 2 3
3 6 3 5
3 6 4 4
现在想查询 C值比具有相同A、B的任意其他记录C值大,D值也比其他的大的记录,如红色记录
 举例来说,比如有商品表
字段为 厂商、 型号、 折扣、 价格
假设 : 同一厂商、同一型号的折扣越大价格应该越低

现在希望过滤出 折扣比同一厂商、同一型号的高,价格反而高的商品

#8


select a,b,max(c) as maxc,max(d) as maxd from @tab 
where a = b
group by a,b

感觉这样的语句虽然能达到功效,但是理论推理好像有瑕疵的地方。楼主描述的再清楚一些吧。

#9


前提是同一厂商、同一型号、同一折扣的价格相同,这样找最大折扣的价格反而高于其他折扣的记录才有意义

#10



DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,3 union all
select 3,1,4,4

select a.*
from @tab a inner join @tab b on a.a=b.a and a.b=b.b
where a.c>b.c and a.d>b.d

楼主试试

#11


是这样,数据库中手工录入大量数据,希望过滤出理论上是错误的数据 ,多谢各位

#12



DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,3 union all
select 3,1,4,4

DECLARE @tmps TABLE (a INT,b int,c INT,d INT)
DECLARE @ret TABLE (a INT,b int,c INT,d INT)

INSERT INTO @tmps(a,b,c,d) SELECT a,b,c,d FROM @tab 
WHERE a=b 

DECLARE @tmp1 TABLE(c INT ,d INT)
WHILE exists(SELECT TOP 1 a FROM @tmps)
BEGIN
DECLARE @a INT
DECLARE @b INT
SELECT TOP 1 @a=a,@b=b FROM @tmps
DELETE FROM @tmp1 
INSERT INTO @tmp1(c,d) SELECT c,d FROM @tmps WHERE a=@a AND b=@b ORDER BY c 
DECLARE @c INT
DECLARE @d int
SELECT TOP 1 @c=c,@d=d FROM @tmp1
DELETE @tmp1 WHERE c=@c AND d=@d 

WHILE EXISTS (SELECT c FROM @tmp1)
BEGIN
DECLARE @c1 INT
DECLARE @d1 INT
SELECT TOP 1 @c1=c,@d1=d FROM @tmp1
DELETE @tmp1 WHERE c=@c1 and d=@d1
IF(@d1>=@d)
INSERT INTO @ret(a,b,c,d)VALUES(@a,@b,@c1,@d1)
ELSE
BEGIN
SET @c=@c1
SET @d=@d1
END
END
DELETE @tmps WHERE a=@a AND b=@b
END
SELECT * FROM @ret

#13


结果 1    1    4    5
3    3    3    4

测试数据只有1个不符合 如果多个不符合的话 也是可以的

#14


引用 11 楼 wyhj5078 的回复:
是这样,数据库中手工录入大量数据,希望过滤出理论上是错误的数据 ,多谢各位

如果是这样问题就相当的复杂了
1,同一厂商、同一型号、同一折扣的价格相同,这样找最大折扣的价格反而高于其他折扣的记录-仅录入价格错误
2,同一厂商、同一型号、价格相同,折扣不同--折扣录错了
3,同一厂商、同一折扣、价格相同,型号不同--型号录错了
。。。。
还有考虑两两组合、三三组合和全录错误等极端情况

一般手工录入数据,如果怕出错,不是你这样处理的,而是由2个录入员同时录入,看录入记录不同的数据,再单独核查,高考成绩单就是这样录入的。

#1


SELECT * FROM TB where A=B

#2


DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,5 union all
select 3,1,4,4

SELECT * FROM @tab AS t
WHERE t.a=t.b

#3


楼上两位,实在抱歉操作不熟,没写完,抱歉更正如下
数据库中有字段A、B、 C、D

如  
A B C D
1 1 2 2
1 1 3 1
1 1 4 5
2 1 2 2
3 3 1 4
3 3 2 3
3 3 3 5
3 1 4 4

现在想查询 C值比具有相同A、B的其他记录C值大,D值也比其他的大,如红色记录

#4


如 下表中红色两天记录  
A B C D
1 1 2 2
1 1 3 1
1 1 4  5
2 1 2 2
3 3 1 4
3 3 2 3
3 3 3  5
3 1 4 4

#5


借2楼数据


DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,5 union all
select 3,1,4,4

select a,b,max(c) as maxc,max(d) as maxd from @tab 
where a = b
group by a,b


结果

1 1 4 5
3 3 3 5



这样也能得到结果,但是我总感觉缺了点什么。
待验证。

#6


上面的好像不对! 数据比较问题,请教高手

改一下数据就知道了。


DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,3 union all
select 3,1,4,4

select a,b,max(c) as maxc,max(d) as maxd from @tab 
where a = b
group by a,b

结果
1 1 4 5
3 3 3 4

没有第二条数据。

#7


数据可能产生歧义
再描述一下
要求是这样的:
A B C D
1 5 2 2
1 5 3 1
1 5 4 52 1 2 2
3 6 1 4
3 6 2 3
3 6 3 5
3 6 4 4
现在想查询 C值比具有相同A、B的任意其他记录C值大,D值也比其他的大的记录,如红色记录
 举例来说,比如有商品表
字段为 厂商、 型号、 折扣、 价格
假设 : 同一厂商、同一型号的折扣越大价格应该越低

现在希望过滤出 折扣比同一厂商、同一型号的高,价格反而高的商品

#8


select a,b,max(c) as maxc,max(d) as maxd from @tab 
where a = b
group by a,b

感觉这样的语句虽然能达到功效,但是理论推理好像有瑕疵的地方。楼主描述的再清楚一些吧。

#9


前提是同一厂商、同一型号、同一折扣的价格相同,这样找最大折扣的价格反而高于其他折扣的记录才有意义

#10



DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,3 union all
select 3,1,4,4

select a.*
from @tab a inner join @tab b on a.a=b.a and a.b=b.b
where a.c>b.c and a.d>b.d

楼主试试

#11


是这样,数据库中手工录入大量数据,希望过滤出理论上是错误的数据 ,多谢各位

#12



DECLARE @tab TABLE(a INT,b INT,c INT,d INT)

INSERT INTO @tab(a,b,c,d)
select 1,1,2,2 union all
select 1,1,3,1 union all
select 1,1,4,5 union all
select 2,1,2,2 union all
select 3,3,1,4 union all
select 3,3,2,3 union all
select 3,3,3,3 union all
select 3,1,4,4

DECLARE @tmps TABLE (a INT,b int,c INT,d INT)
DECLARE @ret TABLE (a INT,b int,c INT,d INT)

INSERT INTO @tmps(a,b,c,d) SELECT a,b,c,d FROM @tab 
WHERE a=b 

DECLARE @tmp1 TABLE(c INT ,d INT)
WHILE exists(SELECT TOP 1 a FROM @tmps)
BEGIN
DECLARE @a INT
DECLARE @b INT
SELECT TOP 1 @a=a,@b=b FROM @tmps
DELETE FROM @tmp1 
INSERT INTO @tmp1(c,d) SELECT c,d FROM @tmps WHERE a=@a AND b=@b ORDER BY c 
DECLARE @c INT
DECLARE @d int
SELECT TOP 1 @c=c,@d=d FROM @tmp1
DELETE @tmp1 WHERE c=@c AND d=@d 

WHILE EXISTS (SELECT c FROM @tmp1)
BEGIN
DECLARE @c1 INT
DECLARE @d1 INT
SELECT TOP 1 @c1=c,@d1=d FROM @tmp1
DELETE @tmp1 WHERE c=@c1 and d=@d1
IF(@d1>=@d)
INSERT INTO @ret(a,b,c,d)VALUES(@a,@b,@c1,@d1)
ELSE
BEGIN
SET @c=@c1
SET @d=@d1
END
END
DELETE @tmps WHERE a=@a AND b=@b
END
SELECT * FROM @ret

#13


结果 1    1    4    5
3    3    3    4

测试数据只有1个不符合 如果多个不符合的话 也是可以的

#14


引用 11 楼 wyhj5078 的回复:
是这样,数据库中手工录入大量数据,希望过滤出理论上是错误的数据 ,多谢各位

如果是这样问题就相当的复杂了
1,同一厂商、同一型号、同一折扣的价格相同,这样找最大折扣的价格反而高于其他折扣的记录-仅录入价格错误
2,同一厂商、同一型号、价格相同,折扣不同--折扣录错了
3,同一厂商、同一折扣、价格相同,型号不同--型号录错了
。。。。
还有考虑两两组合、三三组合和全录错误等极端情况

一般手工录入数据,如果怕出错,不是你这样处理的,而是由2个录入员同时录入,看录入记录不同的数据,再单独核查,高考成绩单就是这样录入的。