Sql server SQL根据文本字段的值删除重复项
我需要根据文本字段(注释)的值删除重复的行 这些记录被认为是重复的,因为它们具有相同的CommentID和PersonID 基本上,我需要保留最新的非空注释 有4种可能的情况: 场景1: 如果第一行没有注释(null/empty),第二行没有注释(null/empty) 然后删除第一行(保留最新注释,即使它为null/空) 场景2: 如果第一行没有注释(null/empty),第二行有注释 然后删除第一行(保留最新注释) 场景3: 如果第一行有注释,第二行有注释 然后删除第一行(保留最新注释) 场景4: 如果第一行有注释,第二行没有注释(null/空) 然后删除第二行(保留第一条注释) 有人有什么想法吗 谢谢, 约翰Sql server SQL根据文本字段的值删除重复项,sql-server,tsql,Sql Server,Tsql,我需要根据文本字段(注释)的值删除重复的行 这些记录被认为是重复的,因为它们具有相同的CommentID和PersonID 基本上,我需要保留最新的非空注释 有4种可能的情况: 场景1: 如果第一行没有注释(null/empty),第二行没有注释(null/empty) 然后删除第一行(保留最新注释,即使它为null/空) 场景2: 如果第一行没有注释(null/empty),第二行有注释 然后删除第一行(保留最新注释) 场景3: 如果第一行有注释,第二行有注释 然后删除第一行(保留最新注释)
简单的方法是在本部分中使用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