获取唯一的或是删除重复的记录

Posted Insus.NET

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取唯一的或是删除重复的记录相关的知识,希望对你有一定的参考价值。

在某一数据表中,数据有冗余了,我们需要获取唯一的记录。

同这样的问题,使用例子来说时,最简单了。
创建一张数据表:

 

 CREATE TABLE dbo.Data
( 
    [ID] int IDENTITY(1,1) NOT NULL, 
    [Item] varchar(55) NULL,      
    [Designation] varchar(20) NULL,
    [Qty] decimal(10, 2) NULL
 ) 
 GO
Source Code


为这张表,添加一些数据,注意一些数据已经重复了:

 

 INSERT INTO [dbo].[Data]
 ([Item],[Designation],[Qty])  VALUES
  (N\'A001\',N\'DES\',1),
  (N\'A001\',N\'DES\',1),
  (N\'A003\',N\'TSG\',12), 
  (N\'A015\',N\'MTT\',6), 
  (N\'A360\',N\'OSS\',7), 
  (N\'A360\',N\'OSS\',7),
  (N\'A360\',N\'OSS\',7),  
  (N\'A521\',N\'FPP\',4), 
  (N\'A015\',N\'MTT\',6),
  (N\'A741\',N\'BBS\',9), 
  (N\'A741\',N\'BBS\',9), 
  (N\'A003\',N\'TSG\',12),
  (N\'A015\',N\'MTT\',6)

  GO
Source Code



如果数据是较高的一些版本,接下来使用ROW_NUMBER()来过滤数据:

WITH TempData ([Item],[Designation],[Qty],[DuplicateCount])
AS
(
    SELECT [Item],[Designation],[Qty],ROW_NUMBER() OVER(PARTITION by [Item],[Designation],[Qty] ORDER BY [Item],[Designation],[Qty]) 
    AS [DuplicateCount]
    FROM [dbo].[Data]
)
SELECT * FROM TempData
Source Code


上面只是知道哪些数据是在重复的。现在我们需要对上面的SQL语句稍改一下,把重复的记录删除:


WITH TempData ([Item],[Designation],[Qty],[DuplicateCount])
AS
(
    SELECT [Item],[Designation],[Qty],ROW_NUMBER() OVER(PARTITION by [Item],[Designation],[Qty] ORDER BY [Item],[Designation],[Qty]) 
    AS [DuplicateCount]
    FROM [dbo].[Data]
)
--SELECT * FROM TempData
DELETE FROM TempData WHERE [DuplicateCount] > 1 
GO

SELECT [Item],[Designation],[Qty] FROM [dbo].[Data]
GO
Source Code

 

以上是关于获取唯一的或是删除重复的记录的主要内容,如果未能解决你的问题,请参考以下文章

获取连接表ID匹配或是ID列表子集的记录[重复]

删除重复的 SQL 记录以允许唯一键

当一列具有唯一值时如何删除重复记录

从 BigQuery 中删除重复记录

如何解决Oracle“不能创建唯一索引,发现重复记录”问题

如何将公交车进/出站记录汇总到行程中以提供唯一ID,并删除时间差小的重复记录?