SQL查询,如何去除重复的记录?

司徒辉空 装修达人 16

今天装修百科网给各位分享sql数据过滤怎么设置的知识,其中也会对SQL查询,如何去除重复的记录?(sql查询,如何去除重复的记录)进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在我们开始吧!

SQL查询,如何去除重复的记录?

首先,先说明一个问题。这样的结果出现,说明系统设计是有问题的。其次删除重复数据,你要提供你是什么数据库。不同数据库会有不同的解决方案。关键字Distinct 去除重复,如下列SQL,去除Test相同的记录;1. select distinct Test from Table2. 如果是要删除表中存在的重复记录,那就逻辑处理,如下:3. select Test from Table group by Test having count(test)>14. 先查询存在重复的数据,后面根据条件删除还有一个更简单的方法可以尝试一下:select aid, count(distinct uid) from 表名 group by aid 这是sqlserver 的写法。

如图一在数据表中有两个膀胱冲洗重复的记录。

SQL查询,如何去除重复的记录?

2

可以通过sql语句“select *from 表名 where 编码 in(select 编码 from 表名 group by 编码 having count(1) >= 2)”来查询出变种所有重复的记录如图二

3

通过sql语句"

delete from 表名 where

编码 in(select 编码 from 表名 group by 编码 having count(1) >= 2)

and 编码 not in (select max(编码)from 表名 group by 编码 having count(1) >=2)

"来删除重复的记录只保留编码最大的记录

用SQL语句怎么过滤重复数据

有一半是添加表的,因为我没有你的结果集,所以拼了个表变量做为结果集
,重点在后半部分,处理逻辑是按你的想写的,前提是如果我没有理解错的话
这个方法的结果集返回的是每一年的数据,年数递增的,行数以有多少个城市为准,不过我感觉你要这样的结果集没有什么意义

declare @tab table(name nvarchar(20), both int)
declare @tabtmp table(name nvarchar(20), both int)
declare @tabname table(name nvarchar(20))
declare @name nvarchar(20)
declare @both int

insert into @tab
select N'上海',1996
union
select N'上海',1997
union
select N'北京',1996
union
select N'北京', 1997

insert into @tabname
select distinct name from @tab

select top 1 @name=name from @tab order by name asc
select @both=MIN(both) from @tab

while(@name is not null)
begin
insert into @tabtmp
select @name,@both

update @tab set name='' where name=@name
set @name=null
select top 1 @name =name from @tab where name'' order by name asc
select top 1 @both=both from @tab where both>@both order by both asc
end

select * from @tabtmp

sql 如何过滤重复记录?

问题背景

在一个多表查询的sql中正常情况下产生的数据都是唯一的,但因为数据库中存在错误(某张表中存在相同的外键ID)导致我这边查询出来的数据就会有重复的问题

下面结果集中UserID:15834存在多个

查询Sql如下:

SELECT *FROM (SELECT ROW_NUMBER() OVER ( ORDER BY T.USERID asc )AS Row,T.USERID,T.CreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON i.UserID=T.UserID) TT WHERE TT.Row between 0 AND 20 ORDER BY UserID DESC

解决方法:

参考下面新的解决方案

在网络上了解到MSSql中通过关键字“PARTITION BY”可以将查询结果集进行分区处理,然后在查询结果集时就可以过滤掉重复的记录了(如果有指定分区字段则区ID相同)

通过更改后的Sql,在Over中添加PARTITION BY T.USERID以UserID进行分区,然后在查询结果集时通过DISTINCT ROW ,过滤掉重复的分区ID号

SELECT DISTINCT ROW ,*FROM (SELECT ROW_NUMBER() OVER (PARTITION BY T.USERID ORDER BY T.USERID asc )AS Row,T.USERID,T.CreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON i.UserID=T.UserID) TT WHERE TT.Row between 0 AND 12 ORDER BY UserID DESC

查询时未过滤重复分区IDDISTINCT ROW ,下面的结果集跟上面的结果集不同(Row是进行过分区的所有有重复Row)

在查询结果集时过滤掉重复的分区ID号 DISTINCT ROW ,

新解决方案:

由于在Sqlserver中如果多表联合查询中除非所有的字段都完全相同否则在使用DISTINCT 用进行去重时还是会当成两个不同的数据集进行处理,因此DISTINCT会失效即

如下面的结果集,虽然 USERID和其他字段内容相同但HID是不相同的所以无法使用DISTINCT进行去重

出现这种问题是因为数据库设计的错误(正常情况下关联表HospitalInfo中只可能存在一条ClinicInfo表对应的记录)

Sql语句:

SELECT *FROM (SELECT ROW_NUMBER() OVER ( order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERETT.Row between 0and20

可以看到上面的结果集中Row是有重复的,其他Row为2的是跟第一个是重复的

因为数据库涉及到其他业务和人员因此我只能提交该问题给相关的技术,但在该问题解决前不能影响到我这边也出现此问题

于是在原sql基础上进行处理,虽然HospitalInfo表中不重复记录但表的自增ID是不可能重复的那我只需要最新的一条记录即可

如果通过DISTINCT过进行去重则就无法成功,因为数据存在差别,可以看到第一条和最后一条数据还是重复的

SELECT DISTINCT row,*FROM (SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERE--row=1 ANDTT.Row between 0 and 20

更改后的Sql

SELECT *FROM (--partition by T.USERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERE--因为之前已经以UserID对结果集进行分区,所以如果存在重复的字段则row的值会不相同--row=1 ANDTT.Row between 0 and 20

USERID=17867相同经过分区后会存在不同的Row值

在对结果集再次过滤时添加条件 : row=1,已经将重复记录中旧的数据过滤掉了 (HID:78)

根据新的解决方案解决了重复的问题,但又出现的新的问题即Row分区后都是重复的,而我再进行分页的时候就无效了(因为此时结果集中的Row都是为1)

解决方案:在结果集再加一层查询并加上ID号然后再对结果集进行分页处理

-- 新增一层查询解决过滤掉重复数据后无法分页的问题SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY userid) AS RowNum,*FROM (--partition by T.USERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=20875--(T.Patient_Tel1 like '%13800000000%')) TT)AS TWHERE--过滤重复数据Row=1--对结果进行分页AND RowNum between 13 and 24

参考:

MSDN: OVER 子句 (Transact-SQL)

stackoverflow sql query distinct with Row_Number

SQL Trick: row_number() is to SELECT what dense_rank() is to SELECT DISTINCT

sql查询过滤问题

你就这几条,连过滤的规则都没说,谁知道你要干什么。
比如说:
过滤掉同一天里FUND_FEE_ID最大的,或者过滤INVERSTMENTFEE不为空且FUND_FEE_ID最小的。
总得有规则吧

sql 如何过滤重复记录

问题背景

在一个多表查询的sql中正常情况下产生的数据都是唯一的,但因为数据库中存在错误(某张表中存在相同的外键ID)导致我这边查询出来的数据就会有重复的问题

下面结果集中UserID:15834存在多个

查询Sql如下:

SELECT *FROM (SELECT ROW_NUMBER() OVER ( ORDER BY T.USERID asc )AS Row,T.USERID,T.CreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON i.UserID=T.UserID) TT WHERE TT.Row between 0 AND 20 ORDER BY UserID DESC

解决方法:

参考下面新的解决方案

在网络上了解到MSSql中通过关键字“PARTITION BY”可以将查询结果集进行分区处理,然后在查询结果集时就可以过滤掉重复的记录了(如果有指定分区字段则区ID相同)

通过更改后的Sql,在Over中添加PARTITION BY T.USERID以UserID进行分区,然后在查询结果集时通过DISTINCT ROW ,过滤掉重复的分区ID号

SELECT DISTINCT ROW ,*FROM (SELECT ROW_NUMBER() OVER (PARTITION BY T.USERID ORDER BY T.USERID asc )AS Row,T.USERID,T.CreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON i.UserID=T.UserID) TT WHERE TT.Row between 0 AND 12 ORDER BY UserID DESC

查询时未过滤重复分区IDDISTINCT ROW ,下面的结果集跟上面的结果集不同(Row是进行过分区的所有有重复Row)

在查询结果集时过滤掉重复的分区ID号 DISTINCT ROW ,

新解决方案:

由于在Sqlserver中如果多表联合查询中除非所有的字段都完全相同否则在使用DISTINCT 用进行去重时还是会当成两个不同的数据集进行处理,因此DISTINCT会失效即

如下面的结果集,虽然 USERID和其他字段内容相同但HID是不相同的所以无法使用DISTINCT进行去重

出现这种问题是因为数据库设计的错误(正常情况下关联表HospitalInfo中只可能存在一条ClinicInfo表对应的记录)

Sql语句:

SELECT *FROM (SELECT ROW_NUMBER() OVER ( order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERETT.Row between 0and20

可以看到上面的结果集中Row是有重复的,其他Row为2的是跟第一个是重复的

因为数据库涉及到其他业务和人员因此我只能提交该问题给相关的技术,但在该问题解决前不能影响到我这边也出现此问题

于是在原sql基础上进行处理,虽然HospitalInfo表中不重复记录但表的自增ID是不可能重复的那我只需要最新的一条记录即可

如果通过DISTINCT过进行去重则就无法成功,因为数据存在差别,可以看到第一条和最后一条数据还是重复的

SELECT DISTINCT row,*FROM (SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERE--row=1 ANDTT.Row between 0 and 20

更改后的Sql

SELECT *FROM (--partition by T.USERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERE--因为之前已经以UserID对结果集进行分区,所以如果存在重复的字段则row的值会不相同--row=1 ANDTT.Row between 0 and 20

USERID=17867相同经过分区后会存在不同的Row值

在对结果集再次过滤时添加条件 : row=1,已经将重复记录中旧的数据过滤掉了 (HID:78)

根据新的解决方案解决了重复的问题,但又出现的新的问题即Row分区后都是重复的,而我再进行分页的时候就无效了(因为此时结果集中的Row都是为1)

解决方案:在结果集再加一层查询并加上ID号然后再对结果集进行分页处理

-- 新增一层查询解决过滤掉重复数据后无法分页的问题SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY userid) AS RowNum,*FROM (--partition by T.USERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=20875--(T.Patient_Tel1 like '%13800000000%')) TT)AS TWHERE--过滤重复数据Row=1--对结果进行分页AND RowNum between 13 and 24

参考:

MSDN: OVER 子句 (Transact-SQL)

stackoverflow sql query distinct with Row_Number

SQL Trick: row_number() is to SELECT what dense_rank() is to SELECT DISTINCT

SQL查询消除在另一个表里存在的记录,如何写呀?

假设select T1.AId,T2.BId from T1 inner join T2 on T1.AId = T2.BId可以得到你想要的结果:
那么:
select aa.*
from (select T1.AId t1aid,T2.BId t2bid from T1 inner join T2 on T1.AId = T2.BId) aa
where not exists (select 1 from t3 where t3.aid = aa.t1aid and t3.bid = aa.t2bid)
就是你要的结果

使用SQL语句查询,过滤掉结果中的某个字符,例如下面的截图。求高手帮助看一下,谢谢!

update 表 set 字段=Replace(字段,"U","");将字段中内容为“U"的用"空"替换!

SQL查询语句,怎样查询重复数据

1、第一步,打开数据库,并创建一个包含重复数据的新用户表,见下图,转到下面的步骤。

 

2、第二步,执行完上面的操作之后,输入如下红框中的SQL语句,然后单击运行按钮,以查看数据库中用户表中的重复数据,见下图,转到下面的步骤。

 

3、第三步,执行完上面的操作之后,查找出了具有重复名称的数据,见下图,转到下面的步骤。

 

4、第四步,执行完上面的操作之后,可以使用如下语句来去除重复数据,见下图,转到下面的步骤。

 

5、第五步,执行完上面的操作之后,最终删除了同一类中的重复数据,见下图。这样,就解决了这个问题了。

 

 

sql 如何过滤重复记录

问题背景

在一个多表查询的sql中正常情况下产生的数据都是唯一的,但因为数据库中存在错误(某张表中存在相同的外键ID)导致我这边查询出来的数据就会有重复的问题

下面结果集中UserID:15834存在多个

查询Sql如下:

SELECT *FROM (SELECT ROW_NUMBER() OVER ( ORDER BY T.USERID asc )AS Row,T.USERID,T.CreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON i.UserID=T.UserID) TT WHERE TT.Row between 0 AND 20 ORDER BY UserID DESC

解决方法:

参考下面新的解决方案

在网络上了解到MSSql中通过关键字“PARTITION BY”可以将查询结果集进行分区处理,然后在查询结果集时就可以过滤掉重复的记录了(如果有指定分区字段则区ID相同)

通过更改后的Sql,在Over中添加PARTITION BY T.USERID以UserID进行分区,然后在查询结果集时通过DISTINCT ROW ,过滤掉重复的分区ID号

SELECT DISTINCT ROW ,*FROM (SELECT ROW_NUMBER() OVER (PARTITION BY T.USERID ORDER BY T.USERID asc )AS Row,T.USERID,T.CreateTimeFROM UserInfo TLEFT JOIN DiseaseInfo i ON i.UserID=T.UserID) TT WHERE TT.Row between 0 AND 12 ORDER BY UserID DESC

查询时未过滤重复分区IDDISTINCT ROW ,下面的结果集跟上面的结果集不同(Row是进行过分区的所有有重复Row)

在查询结果集时过滤掉重复的分区ID号 DISTINCT ROW ,

新解决方案:

由于在Sqlserver中如果多表联合查询中除非所有的字段都完全相同否则在使用DISTINCT 用进行去重时还是会当成两个不同的数据集进行处理,因此DISTINCT会失效即

如下面的结果集,虽然 USERID和其他字段内容相同但HID是不相同的所以无法使用DISTINCT进行去重

出现这种问题是因为数据库设计的错误(正常情况下关联表HospitalInfo中只可能存在一条ClinicInfo表对应的记录)

Sql语句:

SELECT *FROM (SELECT ROW_NUMBER() OVER ( order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERETT.Row between 0and20

可以看到上面的结果集中Row是有重复的,其他Row为2的是跟第一个是重复的

因为数据库涉及到其他业务和人员因此我只能提交该问题给相关的技术,但在该问题解决前不能影响到我这边也出现此问题

于是在原sql基础上进行处理,虽然HospitalInfo表中不重复记录但表的自增ID是不可能重复的那我只需要最新的一条记录即可

如果通过DISTINCT过进行去重则就无法成功,因为数据存在差别,可以看到第一条和最后一条数据还是重复的

SELECT DISTINCT row,*FROM (SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERE--row=1 ANDTT.Row between 0 and 20

更改后的Sql

SELECT *FROM (--partition by T.USERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=17875--(T.Patient_Tel1 like '%13800000000%')) TT WHERE--因为之前已经以UserID对结果集进行分区,所以如果存在重复的字段则row的值会不相同--row=1 ANDTT.Row between 0 and 20

USERID=17867相同经过分区后会存在不同的Row值

在对结果集再次过滤时添加条件 : row=1,已经将重复记录中旧的数据过滤掉了 (HID:78)

根据新的解决方案解决了重复的问题,但又出现的新的问题即Row分区后都是重复的,而我再进行分页的时候就无效了(因为此时结果集中的Row都是为1)

解决方案:在结果集再加一层查询并加上ID号然后再对结果集进行分页处理

-- 新增一层查询解决过滤掉重复数据后无法分页的问题SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY userid) AS RowNum,*FROM (--partition by T.USERID 以UserID对结果集进行分区SELECT ROW_NUMBER() OVER ( partition by T.USERID order by T.USERID asc )AS Row,T.USERID,LEFT(T.Patient_Tel1,5)+'00000000' AS Tel,T.CreateTime,h.HName,h.HIDfromUserInfo TLEFT JOIN ClinicInfo c ON c.UserID=T.UserID AND C.Disabled=1LEFT JOIN HospitalInfo H ON H.HID=c.VisitHospital WHERE T.Disabled=1AND t.UserID>=17867 AND T.UserID<=20875--(T.Patient_Tel1 like '%13800000000%')) TT)AS TWHERE--过滤重复数据Row=1--对结果进行分页AND RowNum between 13 and 24

参考:

MSDN: OVER 子句 (Transact-SQL)

stackoverflow sql query distinct with Row_Number

SQL Trick: row_number() is to SELECT what dense_rank() is to SELECT DISTINCT