删除没有不同的重复值并更改为 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_NUMBER
的 ORDER BY
由OVER
子句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 值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PySpark Dataframe 中删除重复项并将剩余列值更改为 null