您可以使用以下 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 删除重复行数据的更多相关文章

  1. SQL Server删除重复行的6个方法

    SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考. 1.如果有ID字段,就是具有唯一性的字段 delect   ta ...

  2. 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)& ...

  3. sql server删除重复的数据保留一条

    DELETE FROM [TCX_1710_SHZJ].[dbo].[PR_BindingTray] WHERE 1=1 AND SNum in (SELECT * FROM ( (SELECT SN ...

  4. 删除sql server中重复的数据

    原文:删除sql server中重复的数据 with list_numbers as( select Name, AuthorOrTime, Url, Price, EstimatePrice, Si ...

  5. MS SQL Server数据库修复/MDF数据文件数据恢复/MDF质疑/mdf无法附加

    微软的SQL Server 数据库最常用的有两种类型的文件: 1.主要数据文件,文件后缀一般是.MDF: 2.事务日志文件,文件后缀一般是.LDF. 用户数据表.视图.存储过程等等数据,都是存放在MD ...

  6. 通过DBCC Page查看在SQL Server中哪行数据被锁住了?

    原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...

  7. SQL查找删除重复行

    本文讲述如何查找数据库里重复的行.这是初学者十分普遍遇到的问题.方法也很简单.这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysql IRC 频道问到的问题) 如何查找重复行 第一步 ...

  8. SQL Server 删除重复数据只保留一条

    DELETE FROM Bus_TerminalMessage_Keywords WHERE Content IN (select Content from Bus_TerminalMessage_K ...

  9. sql server 小技巧(2) 删除sql server中重复的数据

    with list_numbers as ( select Name, AuthorOrTime, Url, Price, EstimatePrice, Size, Category, ROW_NUM ...

  10. SQL SERVER将多行数据合并成一行(转载)

    昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes  ep_name A ...

随机推荐

  1. Windows MFC HTTP POST请求 函数流程

    Windows MFC HTTP POST请求 函数流程 1 CString m_strHttpUrl(_T("http://10.200.80.86:8090/course/upload& ...

  2. RabbitMQ的全面简述讲解

    **转载自微信公众号:楼仔** 常见的消息队列很多,主要包括 RabbitMQ.Kafka.RocketMQ 和 ActiveMQ,这篇文章只讲 RabbitMQ,先讲原理,后搞实战. 思维导图: 1 ...

  3. SpringBoot项目启动

    SpringBoot项目与其他项目启动方式有些不同. 查看是否是SpringBoot项目,可以查看在项目的pom.xml中是否有引入SpringBoot: 上图中就是对应的spring-boot.若有 ...

  4. PulADC驱动设计

    Ref大电容10uF,X5R或钽电容,不建议NPO 参考信号的驱动(高能输出基准源,或者运放),低阻抗,大SlowRate,小建立时间:: ADA4841-1, AD8021, ADA4899-1, ...

  5. linux Usb serial console

    ubuntu Usb serial console 能够把下电时打印输出到串口上,可以记录,而netconsole只能输出下电到disk 之前的打印 Usb串口线,ftdi或pl2303都可以 如果是 ...

  6. React之一个组件的诞生

    此处以input组件为例 input.js import React from 'react' class Input extends React.Component { // ps:使用static ...

  7. 西瓜书3.3 尝试解题(python)对率回归 极大似然估计

    数据如下: x01=[0.697,0.774,0.634,0.608,0.556,0.403,0.481,0.437,0.666,\ 0.243,0.245,0.343,0.639,0.657,0.3 ...

  8. 问题记录[ PPOME 修改子屏幕日期弹框,No changes to data, periods undone. Message no. 5A496 ]

    最近在做组织信息增强,将子屏幕嵌入PPOME后,修改日期后会弹出信息框并重置300屏幕的开始日期.且PO13和PP01无异常 刚开始以为7000屏幕配置问题,但是对比后并没发现异常.跟踪消息号发现函数 ...

  9. software engineering homework 1

    1. 回顾你过去将近3年的学习经历 当初你报考的时候,是真正喜欢计算机这个专业吗? 你现在后悔选择了这个专业吗? 你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领域)? 答:一开始感觉编程 ...

  10. [fiddler的使用]添加常用字段(请求耗时,客户端请求时间,IP地址)

    1. /* 显示请求耗时 */ function BeginRequestTime(oS: Session) { if (oS.Timers != null) { return oS.Timers.C ...