SQL中查找不重复记录

时间:2021-09-08 00:49:50
我的问题是这样子的:一张表中有两个字段,一个是num,一个是time.一个num有几条记录,怎样从表中查找不同卡号的唯一一条记录。除了用distinct 这个方法之外~~谢谢啦~~

例  num  time
     1    11:12
     1    13:14
     2    11:04

19 个解决方案

#1


     是不是有相同的NUM只取一个?

#2


select * from table where name in (select name from table group by name having count(*) = 1)

#3


1.select num,min(time) from TB group by num
2.select * from TB A where not exists(select 1 from TB where A.num=num And A.time<time)

#4



--取不存在两条以上的num的记录,即只有一条num的记录
select * from tb where not exists(select 1 from tb t where tb.num=t.num group by num having count(*)>1)
--取最小值
select * from tb where time=(select min(time) from tb  t where tb.num=t.num )

#5


引用楼主 qian0729 的回复:
我的问题是这样子的:一张表中有两个字段,一个是num,一个是time.一个num有几条记录,怎样从表中查找不同卡号的唯一一条记录。除了用distinct 这个方法之外~~谢谢啦~~

例 num time
  1 11:12
  1 13:14
  2 11:04

--如果只有这两字段
select num, max(time) time from tb group by num
select num, min(time) time from tb group by num
--如果不止这两字段,多个字段
select t.* from tb t where time = (select max(time) from tb where num = t.num)
select t.* from tb t where time = (select min(time) from tb where num = t.num)
select t.* from tb t where not exists (select 1 from tb where num = t.num and time > t.time)
select t.* from tb t where not exists (select 1 from tb where num = t.num and time < t.time)



#6


该回复于2010-11-24 14:08:48被版主删除

#7


任你挑 SQL中查找不重复记录

--一、按name分组取val最大的值所在行的数据。
--方法1:  
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name 
--方法2:  
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)  
--方法3:  
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name 
--方法4:  
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name 
--方法5  
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name  
  
--二、按name分组取val最小的值所在行的数据。  
--方法1:  
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name  
--方法2:  
select a.* from tb a where not exists(select 1 from tb where name = a.name and val  < a.val)  
--方法3:  
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name  
--方法4:  
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name  
--方法5  
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val  < a.val) order by a.name  
   
--三、按name分组取第一次出现的行所在的数据。  
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name 
         
--四、按name分组随机取一条数据。 
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name 
          
--五、按name分组取最小的两个(N个)val  
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val  < a.val ) order by a.name,a.val  
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val 
select a.* from tb a where exists (select count(*) from tb where name = a.name and val  < a.val having Count(*)  < 2) order by a.name 

--六、按name分组取最大的两个(N个)val 
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val 
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val 
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*)  < 2) order by a.name 

--七,如果整行数据有重复,所有的列都相同。 

--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。 
--创建表并插入数据:  
create table tb(name varchar(10),val int,memo varchar(20)) 
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    1,   'a1--a的第一个值') 
insert into tb values('a',    3,   'a3:a的第三个值')  
insert into tb values('a',    3,   'a3:a的第三个值')  
insert into tb values('b',    1,   'b1--b的第一个值')  
insert into tb values('b',    3,   'b3:b的第三个值')  
insert into tb values('b',    2,   'b2b2b2b2')  
insert into tb values('b',    4,   'b4b4')  
insert into tb values('b',    5,   'b5b5b5b5b5')  
go    
select * , px = identity(int,1,1) into tmp from tb    
select m.name,m.val,m.memo 
from  (    select t.* from tmp t where val = (
select min(val) from tmp where name = t.name)  ) m 
where px = (select min(px) from  (    
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)  ) n 
where n.name = m.name)    drop table tb,tmp    
/*  name       val         memo  
---------- ----------- --------------------  
a          1           a1--a的第一个值  
b          1           b1--b的第一个值    
(2 行受影响)  
*/ 
--在sql server 2005中可以使用row_number函数,不需要使用临时表。 
 --创建表并插入数据:  
 create table tb(name varchar(10),
 val int,memo varchar(20)
 )  
 insert into tb values('a',2,   'a2(a的第二个值)')  
 insert into tb values('a',    1,   'a1--a的第一个值')  
 insert into tb values('a',    1,   'a1--a的第一个值')  
 insert into tb values('a',    3,   'a3:a的第三个值')  
 insert into tb values('a',    3,   'a3:a的第三个值')  
 insert into tb values('b',    1,   'b1--b的第一个值')  
 insert into tb values('b',    3,   'b3:b的第三个值')  
 insert into tb values('b',    2,   'b2b2b2b2')  
 insert into tb values('b',    4,   'b4b4')  
 insert into tb values('b',    5,   'b5b5b5b5b5')  
 go    
 select m.name,m.val,m.memo 
 from  (    
 select * , px = row_number() over(order by name , val) from tb  ) m 
 where px = (select min(px) from  (    
 select * , px = row_number() over(order by name , val) from tb  ) n 
 where n.name = m.name)    
 drop table tb    
 /*  name       val         memo  
 ---------- ----------- --------------------  
 a          1           a1--a的第一个值  
 b          1           b1--b的第一个值    
 (2 行受影响)  
 */

#8


我是来学习的,受益匪浅

#9


SQL中查找不重复记录
路过,很好很强大

#10


引用 9 楼 e_online 的回复:
路过,很好很强大
-----

#11


该回复于2010-12-07 09:26:40被版主删除

#12


大乌龟最近很活跃啊。

#13


各种大神出手  学习

#14


SQL中查找不重复记录

#15


该回复于2010-11-25 13:56:13被版主删除

#16


该回复于2010-12-03 10:30:26被版主删除

#17


谢谢!学了一招~!

#18


select   num, max(time) as time 
from     TB 
group by num 
having   count(*)=1

或者

select   b.*
from     (select num from TB group by num having count(*) = 1) as a
join     TB  as b 
on       a.num = b.num

更通用一些,如果要找恰好有@n条记录的num对应的所有记录

with a as (
  select num from TB group by num having count(*) = @n

select tb.* 
from TB join a on a.num=tb.num


#19


ffffff

#1


     是不是有相同的NUM只取一个?

#2


select * from table where name in (select name from table group by name having count(*) = 1)

#3


1.select num,min(time) from TB group by num
2.select * from TB A where not exists(select 1 from TB where A.num=num And A.time<time)

#4



--取不存在两条以上的num的记录,即只有一条num的记录
select * from tb where not exists(select 1 from tb t where tb.num=t.num group by num having count(*)>1)
--取最小值
select * from tb where time=(select min(time) from tb  t where tb.num=t.num )

#5


引用楼主 qian0729 的回复:
我的问题是这样子的:一张表中有两个字段,一个是num,一个是time.一个num有几条记录,怎样从表中查找不同卡号的唯一一条记录。除了用distinct 这个方法之外~~谢谢啦~~

例 num time
  1 11:12
  1 13:14
  2 11:04

--如果只有这两字段
select num, max(time) time from tb group by num
select num, min(time) time from tb group by num
--如果不止这两字段,多个字段
select t.* from tb t where time = (select max(time) from tb where num = t.num)
select t.* from tb t where time = (select min(time) from tb where num = t.num)
select t.* from tb t where not exists (select 1 from tb where num = t.num and time > t.time)
select t.* from tb t where not exists (select 1 from tb where num = t.num and time < t.time)



#6


该回复于2010-11-24 14:08:48被版主删除

#7


任你挑 SQL中查找不重复记录

--一、按name分组取val最大的值所在行的数据。
--方法1:  
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name 
--方法2:  
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)  
--方法3:  
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name 
--方法4:  
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name 
--方法5  
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name  
  
--二、按name分组取val最小的值所在行的数据。  
--方法1:  
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name  
--方法2:  
select a.* from tb a where not exists(select 1 from tb where name = a.name and val  < a.val)  
--方法3:  
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name  
--方法4:  
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name  
--方法5  
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val  < a.val) order by a.name  
   
--三、按name分组取第一次出现的行所在的数据。  
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name 
         
--四、按name分组随机取一条数据。 
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name 
          
--五、按name分组取最小的两个(N个)val  
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val  < a.val ) order by a.name,a.val  
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val 
select a.* from tb a where exists (select count(*) from tb where name = a.name and val  < a.val having Count(*)  < 2) order by a.name 

--六、按name分组取最大的两个(N个)val 
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val 
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val 
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*)  < 2) order by a.name 

--七,如果整行数据有重复,所有的列都相同。 

--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。 
--创建表并插入数据:  
create table tb(name varchar(10),val int,memo varchar(20)) 
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    1,   'a1--a的第一个值') 
insert into tb values('a',    3,   'a3:a的第三个值')  
insert into tb values('a',    3,   'a3:a的第三个值')  
insert into tb values('b',    1,   'b1--b的第一个值')  
insert into tb values('b',    3,   'b3:b的第三个值')  
insert into tb values('b',    2,   'b2b2b2b2')  
insert into tb values('b',    4,   'b4b4')  
insert into tb values('b',    5,   'b5b5b5b5b5')  
go    
select * , px = identity(int,1,1) into tmp from tb    
select m.name,m.val,m.memo 
from  (    select t.* from tmp t where val = (
select min(val) from tmp where name = t.name)  ) m 
where px = (select min(px) from  (    
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)  ) n 
where n.name = m.name)    drop table tb,tmp    
/*  name       val         memo  
---------- ----------- --------------------  
a          1           a1--a的第一个值  
b          1           b1--b的第一个值    
(2 行受影响)  
*/ 
--在sql server 2005中可以使用row_number函数,不需要使用临时表。 
 --创建表并插入数据:  
 create table tb(name varchar(10),
 val int,memo varchar(20)
 )  
 insert into tb values('a',2,   'a2(a的第二个值)')  
 insert into tb values('a',    1,   'a1--a的第一个值')  
 insert into tb values('a',    1,   'a1--a的第一个值')  
 insert into tb values('a',    3,   'a3:a的第三个值')  
 insert into tb values('a',    3,   'a3:a的第三个值')  
 insert into tb values('b',    1,   'b1--b的第一个值')  
 insert into tb values('b',    3,   'b3:b的第三个值')  
 insert into tb values('b',    2,   'b2b2b2b2')  
 insert into tb values('b',    4,   'b4b4')  
 insert into tb values('b',    5,   'b5b5b5b5b5')  
 go    
 select m.name,m.val,m.memo 
 from  (    
 select * , px = row_number() over(order by name , val) from tb  ) m 
 where px = (select min(px) from  (    
 select * , px = row_number() over(order by name , val) from tb  ) n 
 where n.name = m.name)    
 drop table tb    
 /*  name       val         memo  
 ---------- ----------- --------------------  
 a          1           a1--a的第一个值  
 b          1           b1--b的第一个值    
 (2 行受影响)  
 */

#8


我是来学习的,受益匪浅

#9


SQL中查找不重复记录
路过,很好很强大

#10


引用 9 楼 e_online 的回复:
路过,很好很强大
-----

#11


该回复于2010-12-07 09:26:40被版主删除

#12


大乌龟最近很活跃啊。

#13


各种大神出手  学习

#14


SQL中查找不重复记录

#15


该回复于2010-11-25 13:56:13被版主删除

#16


该回复于2010-12-03 10:30:26被版主删除

#17


谢谢!学了一招~!

#18


select   num, max(time) as time 
from     TB 
group by num 
having   count(*)=1

或者

select   b.*
from     (select num from TB group by num having count(*) = 1) as a
join     TB  as b 
on       a.num = b.num

更通用一些,如果要找恰好有@n条记录的num对应的所有记录

with a as (
  select num from TB group by num having count(*) = @n

select tb.* 
from TB join a on a.num=tb.num


#19


ffffff

#20