sql根据某一个字段重复只取第一条数据

本文介绍了如何使用row_number()函数进行数据库分组编号,通过partition_by指定分组字段,orderby确定编号顺序,展示了一个SQL示例来获取分组标号为1的记录,适合数据库操作者参考。

使用分析函数row_number() over (partiion by … order by …)来进行分组编号,然后取分组标号值为1的记录即可。目前主流的数据库都有支持分析函数,很好用。

其中,partition by 是指定按哪些字段进行分组,这些字段值相同的记录将在一起编号;order by则是指定在同一组中进行编号时是按照怎样的顺序。

select s.*  
from ( 
    select *, row_number() over (partition by [手机号] order by [店铺]) as group_idx  
    from table_name
) s
where s.group_idx = 1
SQL Server 中,去除重复数据只保留一条可以采用以下几种方法: ### 使用 ROW_NUMBER() 窗口函数 通过 `ROW_NUMBER()` 窗口函数为每一行分配一个行号,按重复列的条件分组,然后删除行号大于 1 的行。示例代码如下: ```sql WITH CTE AS ( SELECT code, timePoint, ROW_NUMBER() OVER (PARTITION BY code, TimePoint ORDER BY (SELECT 0)) AS rn FROM table_name ) DELETE FROM CTE WHERE rn > 1; ``` 此代码中,`PARTITION BY` 用于按条件分组,`rn > 1` 用于删除所有重复的行,只保留每组中的第一行 [^1]。 ### 基于多个字段判断重复 同样使用 `ROW_NUMBER()` 窗口函数,以多个字段作为分组依据。示例如下: ```sql WITH cte AS ( SELECT col1, col2, ROW_NUMBER() OVER(PARTITION BY col1, col2 ORDER BY (SELECT 0)) AS rn FROM talbe_name ) DELETE FROM cte WHERE rn > 1; ``` 该代码以 `col1` 和 `col2` 作为分组依据,删除重复行,只保留每组的第一行 [^2]。 ### 按特定字段判断重复 如果根据单个字段判断重复,可以先查找重复记录,再删除多余的重复记录,只保留 `rowid` 最小的记录。示例如下: ```sql -- 查找表中多余的重复记录 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1); -- 删除表中多余的重复记录 delete from people where peopleName in (select peopleName from people group by peopleName having count(peopleName) > 1) and peopleId not in (select min(peopleId) from people group by peopleName having count(peopleName)>1); ``` 若要根据多个字段判断重复,示例代码如下: ```sql -- 查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1); -- 删除表中多余的重复记录(多个字段) delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1); ``` 上述代码分别实现了根据单个字段和多个字段判断重复记录,并删除多余记录,只保留最小 `rowid` 的记录 [^3]。 ### 按指定列删除重复数据 示例代码如下: ```sql WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CB_ChildBaseInfoID,AdminId,CONVERT(varchar(100), CreateTime, 23) ORDER BY (SELECT NULL)) AS rn FROM LT_VisionScree(表) ) DELETE FROM CTE WHERE rn > 1; ``` 此代码以 `CB_ChildBaseInfoID`、`AdminId` 和转换后的 `CreateTime` 作为分组依据,删除重复行,只保留每组的第一行 [^5]。 ### 查询方式保留一条记录 ```sql select * From (Select Row_Number() Over(Partition By [Mnumber] order By [Mnumber]) As RowNumber,* From MCCESS)T Where T.RowNumber = 1; ``` 该代码通过 `ROW_NUMBER()` 函数对 `Mnumber` 列进行分组,查询时只保留每组 `RowNumber` 为 1 的记录 [^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值