脑实人 發表於 2025-7-8 09:24:53

sqlserver CTE删除重复数据的实现方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">sqlserver CTE删除重复数据</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">实现删除重复数据,并保留一条</a></li></ul><li><a href="#_label1">SQL server 删除完全重复的数据并保留一条</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">前提</a></li><li><a href="#_lab2_1_2">实现删除重复数据,并保留一条</a></li><li><a href="#_lab2_1_3">解释</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>sqlserver CTE删除重复数据</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><p class="maodian"><a name="_lab2_1_2"></a></p><h3>实现删除重复数据,并保留一条</h3>
<ul><li>使用&nbsp;<code>ROW_NUMBER()</code>&nbsp;窗口函数为每一行分配一个行号,按重复列的条件分组;</li><li>使用&nbsp;<code>CTE</code>&nbsp;来表示重复的行;</li><li>删除行号大于1的行。</li></ul>
<div class="jb51code"><pre class="brush:sql;">WITH CTE AS (
SELECT
IOT_TerminalNo,SendDate,EVoltage,ECurrent,CreateTime,
ROW_NUMBER() OVER ( PARTITION BY IOT_TerminalNo, SendDate ORDER BY (SELECT 0) ) AS rn
FROM
Equipment_1001
where
--IOT_TerminalNo='Weldjoin-000001' AND
SendDate &gt;='2025-04-01 00:00:00.000'
AND SendDate&lt;'2025-07-07 13:26:32.830'
)
DELETE FROM CTE WHERE rn &gt; 1;</pre></div>
<ul><li><code>PARTITION BY</code>:按条件分组;</li><li><code>rn &gt; 1</code>:删除所有重复的行,只保留每组中的第一行;</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>SQL server 删除完全重复的数据并保留一条</h2>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>前提</h3>
<p>SQL server 数据库,某张表有主键,且存在多条完全重复的数据,并且重复数据的ID也完全相同,在删除其中一条后,所有的重复数据全都被删除了。</p>
<h3>实现删除重复数据,并保留一条</h3>
<ol><li>使用 <code>ROW_NUMBER()</code> 窗口函数为每一行分配一个行号,按重复列的条件分组;</li><li>使用 <code>CTE</code> 来表示重复的行;</li><li>删除行号大于1的行。</li></ol>
<div class="jb51code"><pre class="brush: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 &gt; 1;</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>解释</h3>
<ul><li><code>PARTITION BY</code>:按条件分组;</li><li><code>rn &gt; 1</code>:删除所有重复的行,只保留每组中的第一行;</li></ul>
頁: [1]
查看完整版本: sqlserver CTE删除重复数据的实现方法