MS SQL Server 删除重复行数据
您可以使用以下 SQL 语句删除 MS SQL Server 表中重复的行:
WITH CTE AS (
SELECT ROW_NUMBER() OVER(PARTITION BY column1, column2, ... columnN ORDER BY (SELECT 0)) RN
FROM table_name
)
DELETE FROM CTE WHERE RN > 1;
您需要将 table_name
替换为要删除重复行的表名,并将 column1, column2, ... columnN
替换为用于检查重复的列名。该语句使用 ROW_NUMBER()
函数和 PARTITION BY
子句来标识重复的行,然后使用 DELETE
语句删除其中一个副本。
这样说有些抽象,下面举一个例子:
比如我有一个deadUrlRecord_copy1 表,存的数据如下格式。
这个表存在一个问题,url列有一部分是重复的。用group by语句可以查出来,有挺多重复的,那么,如何删除多余的数据,只保留一条呢?
这就要采用文章开头给出的语句了。
WITH cte AS (
SELECT url,
ROW_NUMBER() OVER (PARTITION BY url ORDER BY url) AS rn
FROM deadUrlRecord_copy1
WHERE status = 'NotFound'
)
DELETE FROM cte WHERE rn > 1;
乍一看一脸懵逼,但是执行发现竟然成功删除了重复数据,达到了预期效果,为什么呢?
这要解释下这一行代码:
ROW_NUMBER() OVER (PARTITION BY url ORDER BY url) AS rn
这是一种 SQL 语法,用于对一个查询结果集的行进行编号,并且可以根据特定列来分组编号。
具体来说,ROW_NUMBER()
是一个窗口函数,它会为查询结果集中每一行计算一个行号。而 OVER
子句则是指定如何定义窗口(window),也就是要给哪些行计算行号。在这个例子中,PARTITION BY url
表示按照 url
这一列进行分组,也就是说对于每个不同的 url
分别计算行号;ORDER BY url
则表示按照 url
这一列进行排序,这样同一个 url
中的行就会按照 url
的值依次排列。最后,AS rn
则是给这个新的行号列起个名字,即 rn
。
例如,假设有如下表格:
id | url |
---|---|
1 | www.example.com |
2 | www.example.com |
3 | www.example.com/foo |
4 | www.example.com/bar |
5 | www.google.com |
如果执行以下 SQL 查询:
SELECT id, url, ROW_NUMBER() OVER (PARTITION BY url ORDER BY url) AS rn FROM my_table;
则会得到以下结果:
id | url | rn |
---|---|---|
1 | www.example.com | 1 |
2 | www.example.com | 2 |
3 | www.example.com/foo | 1 |
4 | www.example.com/bar | 1 |
5 | www.google.com | 1 |
其中,同一个 url
中的行拥有相同的行号,同时这个行号是按照 url
的值进行排序的。
然后执行刚才那段代码的片段试一下,可能更好理解:
url不同的,行号都是1。相同的,会从1开始排序,所有就出现了2.
然后用 DELETE FROM cte WHERE rn > 1; 删除行号>1的数据,就成功把多余的数据删除了,非常巧妙。
MS SQL Server 删除重复行数据的更多相关文章
- SQL Server删除重复行的6个方法
SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect ta ...
- MS Sql Server 消除重复行 保留信息完整的一条 2011-11-26 13:19(QQ空间)
select company ,count(company) as coun into myls from mylist group by company having count(company)& ...
- sql server删除重复的数据保留一条
DELETE FROM [TCX_1710_SHZJ].[dbo].[PR_BindingTray] WHERE 1=1 AND SNum in (SELECT * FROM ( (SELECT SN ...
- 删除sql server中重复的数据
原文:删除sql server中重复的数据 with list_numbers as( select Name, AuthorOrTime, Url, Price, EstimatePrice, Si ...
- MS SQL Server数据库修复/MDF数据文件数据恢复/MDF质疑/mdf无法附加
微软的SQL Server 数据库最常用的有两种类型的文件: 1.主要数据文件,文件后缀一般是.MDF: 2.事务日志文件,文件后缀一般是.LDF. 用户数据表.视图.存储过程等等数据,都是存放在MD ...
- 通过DBCC Page查看在SQL Server中哪行数据被锁住了?
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...
- SQL查找删除重复行
本文讲述如何查找数据库里重复的行.这是初学者十分普遍遇到的问题.方法也很简单.这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysql IRC 频道问到的问题) 如何查找重复行 第一步 ...
- SQL Server 删除重复数据只保留一条
DELETE FROM Bus_TerminalMessage_Keywords WHERE Content IN (select Content from Bus_TerminalMessage_K ...
- sql server 小技巧(2) 删除sql server中重复的数据
with list_numbers as ( select Name, AuthorOrTime, Url, Price, EstimatePrice, Size, Category, ROW_NUM ...
- SQL SERVER将多行数据合并成一行(转载)
昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes ep_name A ...
随机推荐
- Kubernetes--Ingress资源类型
Ingress资源类型 基于HTTP暴露的每个Service资源均可发布于一个独立的FQDN主机名之上,如 " www.ik8s.io " :也可发布于某主机上的URL路径之上,从 ...
- idea 常用的快捷键
1.ctrl+shitf+u 大小写切换 2.ctrl+shitf+L 快速格式化代码 3.ctrl+alt+方向左键 快速回到上一层 4..ctrl+shitf+E 最近更改的文件 5.ctrl ...
- Python跳一跳小游戏
一:准备工具 adb 驱动 下载链接:http://adbshell.com/upload/adb.zip 安卓手机 打开手机调试模式 usb线接好手机和电脑 PyCharm:专门用于Python ...
- dos命令初学
DOS命令 打开DOS命令方式 开始+系统+命令提示符 WIN键盘+R 输入CMD 打开控制台(推荐使用) 在任意文件夹下面,按住shift键加鼠标右键点击,在此处打开命令行窗口 自愿管理器的地址栏前 ...
- stm32 微秒定延时问题
problem: 如果想用计时器定时微秒级,不要使能自动重载:代码如下: static uint16_t counter; void Delay_us(uint32_t us){ counter=0x ...
- echarts 折柱表混合图(折线,柱状图,表格)
效果图如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 接口自动化(TestNG)
数据驱动概念: 用户输入输出数据来判断测试用例是否通过从而验证需求的测试. 一.接口自动化框架搭建(TestNG数据驱动) ---parameter 关键代码: <?xml version=&q ...
- UE C++教程之接口 UINTERFACE
我是谁不重要,重要的是,我能做什么. 近期笔者在进行UE的开发时,实现多武器的换弹与开火需要用到接口.而笔者以前是做Unity开发的,遂没有使用过UE C++的UINTERFACE,而这个接口在使用过 ...
- Tomcat和Maven安装与配置
链接:https://pan.baidu.com/s/1aezz2pfCn0DCCPw8udQFXA 提取码:wd4f 一.网站发布1.1.为什么要用tomcat网页开发好了,该如何发布呢?我们需要一 ...
- 设置mode='out-on'导致路由切换过快路由加载报错 Failed to execute 'insertBefore' on 'Node'
原代码: 解决代码: 原因未知