删除没有不同的重复值并更改为 NULL 值

Posted

技术标签:

【中文标题】删除没有不同的重复值并更改为 NULL 值【英文标题】:Remove Duplicate Values Without Distinct and Change Into NULL Values 【发布时间】:2021-08-24 08:14:40 【问题描述】:

我想删除重复的行并将重复的行转换为空值,但我不知道如何在 SQL Server 中执行此操作

这是我的表记录的 sn-ps

RefNo TrxDate TrxID
1238688846 2021-05-26 18:35:54.393 '2f01b431-bca5-4d84-cd90-d5a8727a782d
1238688846 2021-05-26 18:33:48.993 '2f01b431-bca5-4d84-cd90-d5a8727a782d

我的预期结果是在包含最小日期的行上更改为 NULL 值

RefNo TrxDate TrxID
1238688846 2021-05-26 18:35:54.393 '2f01b431-bca5-4d84-cd90-d5a8727a782d
NULL NULL NULL

这是我的代码 sn-ps

SELECT 
    X.ReferenceNo,
    X.TransactionDate,
    Y.TransactionID,
FROM [TABLE] X
INNER JOIN [TABLE] Y ON X.Key1  = X.Key1 
    AND RIGHT(Y.Key2,10) = RIGHT(X.Key2,10)
    AND Y.Key3 = 'Blablabla'
    AND X.Key4 <> Y.Key4

您的回答会很有帮助。谢谢

【问题讨论】:

为什么还要保留空行?为什么不删除它们? @DaleK 我需要保留空行,因为我会将它们插入到临时表中 但是您可能有多个空行而无法区分它们?哦,好吧,我想你知道你在做什么:) 【参考方案1】:

ROW_NUMBER 中使用一些CASE 表达式。 PARTITION BY 子句是一个猜测,因为我们的预期结果很少,也没有样本数据(所以我无法测试),所以您可能需要适当地修改它:

SELECT 
    CASE ROW_NUMBER() OVER (PARTITION BY Y.TransactionID ORDER BY X.TransactionDate DESC) WHEN 1 THEN X.ReferenceNo END AS ReferenceNo,
    CASE ROW_NUMBER() OVER (PARTITION BY Y.TransactionID ORDER BY X.TransactionDate DESC) WHEN 1 THEN X.TransactionDate END AS TransactionDate,
    CASE ROW_NUMBER() OVER (PARTITION BY Y.TransactionID ORDER BY X.TransactionDate DESC) WHEN 1 THEN Y.TransactionID END AS TransactionID
FROM [TABLE] X
INNER JOIN [TABLE] Y ON X.Key1  = X.Key1 
    AND RIGHT(Y.Key2,10) = RIGHT(X.Key2,10)
    AND Y.Key3 = 'Blablabla'
    AND X.Key4 <> Y.Key4;

【讨论】:

哇!!谢谢你的回答,它符合我的需要,我需要这个插入到临时表中 然后在你的临时表 @Arya 前面加上 INSERT 子句。 @Larnu 。 . .为此,您需要在外部查询中使用order by @GordonLinoff 不,你不知道,ROW_NUMBERORDER BYOVER 子句not 外部查询的ORDER BY 确定。 @Larnu 。 . . OP 希望在具有值的行之后返回 NULL 值。除非外部查询具有 order by,否则查询中没有排序。【参考方案2】:

或者您可以只使用一次 CTE 和 row_number()(因为我不喜欢在查询中重复表达式)和 case 表达式来消除不需要的值。

WITH CTE AS (
    SELECT 
        X.ReferenceNo
        , X.TransactionDate
        , Y.TransactionID
        , ROW_NUMBER() OVER (PARTITION BY X.ReferenceNo ORDER BY X.TransactionDate DESC) rn
    FROM [TABLE] X
    INNER JOIN [TABLE] Y ON X.Key1  = X.Key1 
        AND RIGHT(Y.Key2,10) = RIGHT(X.Key2,10)
        AND Y.Key3 = 'Blablabla'
        AND X.Key4 <> Y.Key4
)
SELECT
  CASE WHEN rn > 1 THEN NULL ELSE ReferenceNo END ReferenceNo
  , CASE WHEN rn > 1 THEN NULL ELSE TransactionDate END TransactionDate
  , CASE WHEN rn > 1 THEN NULL ELSE TransactionID END TransactionID
FROM CTE;

【讨论】:

以上是关于删除没有不同的重复值并更改为 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查询某字段重复值并删除重复值

如何从 PySpark Dataframe 中删除重复项并将剩余列值更改为 null

如何合并子数组值并删除重复项?

在 XML 中查找重复值并在 XSL 中删除节点

如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?

删除(使 null)重复的字段值