【问题标题】:Identify records with duplicate and unique values识别具有重复和唯一值的记录
【发布时间】:2015-06-18 20:10:40
【问题描述】:

我正在寻找外键不同的记录上的重复地址。这给了我重复的内容:

select quoteID, insuredID, Address1, PolicyID
from quote
where 
address1 in(select address1 from quote group by address1 having count(address1) > 1)
and datalength(address1) <> 0
order by address1

我想过滤掉所有被保险人ID 相同的记录。我真的需要在结果中保留quoteID,以便我可以调查问题帐户。我正在使用 SQL Server 2008。

【问题讨论】:

标签: sql sql-server-2008 foreign-keys duplicates


【解决方案1】:

使用窗口函数。如果我理解你想要的逻辑:

select q.*
from (select q.*,
             min(insuredId) over (partition by address1) as minii,
             max(insuredId) over (partition by address1) as maxii
      from quote
      where datalength(address1) <> 0
     ) q
where minii <> maxii;

如果我的列有误,那么您可能想要类似的东西。

我认为您有充分的理由使用datalength() 而不仅仅是len()

【讨论】:

  • 我是 SQL 新手,在这个网站上找到了如何消除空白。我只是用 len 换掉了 datalength 并且这也有效 - 必须阅读差异。我尝试了您的建议的略微修改版本,它让我更接近......谢谢 - 如果我得到我想要的,我会继续完善那个 amd 标记。
【解决方案2】:

如果我理解正确,您只想找到那些地址相同但被保险人身份不同的记录。

下面的查询应该做到这一点,首先它像你一样抓取所有重复的地址记录,然后加入它以仅提取具有这些地址的记录。然后按地址和被保险人身份分组,只获取记录数为 1,大于 1 表示它们共享相同的被保险人身份和地址,这不是你想要的。

select quoteID, insuredID, Address1, PolicyID
from quote
    inner join (select Address1, insuredID
    from quote
        inner join (select address1 from quote where address1 IS NOT NULL group by address1 having count(address1) > 1) T1 on quote.address1 = T1.address1
    group by insuredID, Address1
    having count(address1) = 1) T2  on quote.address1 = T2.address1 and quote.insuredID = T2.insuredID
order by address1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2013-08-03
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多