SQL根据文本字段

时间:2018-02-03 13:06:42

标签: sql-server tsql

我需要根据文本字段的值(注释)删除重复的行。

记录被视为重复记录,因为它们具有相同的CommentID和PersonID。

基本上,我需要保留最新的NON NULL评论。

有四种可能的情况:

场景1:     如果第一行没有Comment(null / empty)并且第二行没有Comment(null / empty)     然后删除第一行(保留最新的评论,即使它是空的/空)

场景2:     如果第一行没有注释(null / empty),则第二行有注释     然后删除第一行(保留最新评论)

场景3:     如果第一行有一个注释而第二行有一个注释     然后删除第一行(保留最新评论)

场景4:     如果第一行有一个注释而第二行没有注释(null / empty)     然后删除第二行(保留第一个注释)

有人有任何想法吗?

谢谢, 约翰。

CREATE TABLE [dbo].[PersonComment](
    [PersonCommentID] [int] NOT NULL,
    [CommentID] [int] NOT NULL,
    [Comment] [text] NULL,
    [PersonID] [int] NOT NULL
) 

INSERT INTO [dbo].[PersonComment]
    ([PersonCommentID]
    ,[CommentID]
    ,[Comment]
    ,[PersonID])
VALUES
    (1,555,'Hello',123),
    (2,555,'Hello World',123),
    (3,444,'Hello',112),
    (4,444,'Hello World',112),
    (5,333,'Hello World',111),
    (6,333,NULL,111),
    (7,222,NULL,100),
    (8,222,'Hello',100),
    (9,111,NULL,99),
    (10,111,NULL,99)

SELECT * FROM [dbo].[PersonComment] WITH (NOLOCK)

enter image description here

2 个答案:

答案 0 :(得分:2)

如上所述,您应该使用ROW_NUMBER订购按CommentIDPersonID分组的表格。并按Comment列的长度排序。

在您的DDL中,Comment列的类型为text。它已被弃用,您应该避免使用text数据类型。

with cte as (
    select 
        *
        , row_number() over (
                partition by CommentID, PersonID 
                order by case when isnull(datalength(Comment), 0) = 0 then 1 else 0 end, PersonCommentID desc
        ) rn
    from 
        [dbo].[PersonComment]
)

delete from cte where rn > 1

答案 1 :(得分:0)

简单的方法是在这部分使用CTE,下面是一个样本

WITH CTE AS(
 SELECT  [PersonCommentID]
  , RN = ROW_NUMBER()OVER(PARTITION BY    [Comment]  
 Order by [Comment])
 FROM  PersonComment
)

DELETE FROM CTE WHERE RN > 1