Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL根据文本字段的值删除重复项_Sql Server_Tsql - Fatal编程技术网

Sql server SQL根据文本字段的值删除重复项

Sql server SQL根据文本字段的值删除重复项,sql-server,tsql,Sql Server,Tsql,我需要根据文本字段(注释)的值删除重复的行 这些记录被认为是重复的,因为它们具有相同的CommentID和PersonID 基本上,我需要保留最新的非空注释 有4种可能的情况: 场景1: 如果第一行没有注释(null/empty),第二行没有注释(null/empty) 然后删除第一行(保留最新注释,即使它为null/空) 场景2: 如果第一行没有注释(null/empty),第二行有注释 然后删除第一行(保留最新注释) 场景3: 如果第一行有注释,第二行有注释 然后删除第一行(保留最新注释)

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

这些记录被认为是重复的,因为它们具有相同的CommentID和PersonID

基本上,我需要保留最新的非空注释

有4种可能的情况:

场景1: 如果第一行没有注释(null/empty),第二行没有注释(null/empty) 然后删除第一行(保留最新注释,即使它为null/空)

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

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

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

有人有什么想法吗

谢谢, 约翰


简单的方法是在本部分中使用CTE,下面是一个示例

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

DELETE FROM CTE WHERE RN > 1

如前所述,您应该使用
行号
CommentID
PersonID
对表进行分组。并按
注释
列的长度排序

在DDL的
注释
列中,类型为
文本
。它已被弃用,您应该避免使用
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

您可以按CommentID和PersonID分组,然后选择last。展示了一种方法。感谢marc-s/JustinasHi Ali,感谢您这么快的回复。注释字段是文本类型,所以我必须转换才能使用它。不幸的是,您的解决方案删除了两个额外的行,只有一半的行应该被删除(5行)啊。。。按数据长度排序(注释),这是我缺少的一点。万分感谢乌兹!!!!
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