我需要根据文本字段的值(注释)删除重复的行。
记录被视为重复记录,因为它们具有相同的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)
答案 0 :(得分:2)
如上所述,您应该使用ROW_NUMBER
订购按CommentID
和PersonID
分组的表格。并按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