查找另一列具有不同列的重复项

Posted

技术标签:

【中文标题】查找另一列具有不同列的重复项【英文标题】:Find duplicates where another column have different columns 【发布时间】:2015-03-03 12:17:37 【问题描述】:

我需要更新将匹配特定查询的记录,因此我目前正在尝试找出如何找到一列值不同的重复值列表。

我有如下表定义

DocumentId (BIGINT)
NotePopupId (INT)
IsPopup (BIT)
Note (NVARCHAR(100))

我的表可能有如下数据:

1|1|False|Note1

1|2|False|Note2

2|1|False|Note1

2|2|True|Popup1

3|1|False|Note1

3|2|True|Popup1

4|1|False|Note1

4|2|False|Note2

我需要返回一个 DocumentId 列表,其中定义了多个 DocumentId 但 IsPopup 字段为 True 和 False 并忽略它们全部为 false 或全部为 true 的那些。

我了解如何编写一个基本查询来返回重复的总数,但我不明白如何确保它只返回其 IsPopup 字段设置为 true 和 false 2 或更多的重复DocumentId 相同的记录。

所以在本例中,根据上述情况,它将返回 DocumentId 2 和 3。

谢谢。

【问题讨论】:

【参考方案1】:

我倾向于使用group by 和聚合来处理这样的问题:

select documentId
from table
group by documentId
having min(cast(isPopup as int)) = 0 and max(cast(isPopup as int)) = 1;

【讨论】:

太棒了,太简单了!!从未想过您可以使用 min & max 聚合以这种方式识别值。学到了新东西!谢谢:) 快速提问。我在查询中添加了“and count(documentid) > 1”,但我看到结果是一样的。使用 Min 和/或 Max 是否以某种方式假定计数大于 1? 那些函数没有这样的假设。但是在单个列中检查两个不同的值将要求您必须有至少两行才能使用。所以count(documentid) > 1 自动为真。【参考方案2】:

找到Distinct Count并过滤计数大于1的组。试试这个。

select DocumentId 
from yourtable 
group by DocumentId 
having count(Distinct IsPopup)>1

如果您想在只有一个 IsPopup 时返回 documentId,请使用此

select DocumentId 
from yourtable 
group by DocumentId 
having count(Distinct IsPopup)>1 or count(IsPopup)=1

【讨论】:

【参考方案3】:

这样可能会更高效一些

select distinct t1.documentId
  from table t1 
  join table t2
    on t1.documentId = t2.documentId 
   and t1.IsPopup = 'true'
   and t2.IsPopup = 'false'

【讨论】:

【参考方案4】:
SELECT  documentId
    from table
    group by documentId
     having min(convert(int,isPopup)) !=  max(convert(int,isPopup));

【讨论】:

以上是关于查找另一列具有不同列的重复项的主要内容,如果未能解决你的问题,请参考以下文章

具有 1 个不同的列和来自另一列的总和值 [关闭]

根据另一列中的值删除一列的重复项,Python,Pandas

SQL Server:选择一列的计数,同时检查另一列中的不同值

如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项

从 MySQL 中具有不同列的表的多个连接结果中删除重复项

根据不同数据类型的另一列设置一列的默认值