【问题标题】:Report duplicate data报告重复数据
【发布时间】:2017-03-23 13:07:54
【问题描述】:
create table dupt(cat varchar(10), num int)

insert dupt(cat,num) values ('A',1),('A',2),('A',3),
                            ('B',1),('B',2),
                            ('C',1),('C',2), ('C',3),
                            ('D',1),('D',2), ('D',4),
                            ('E',1),('E',2),
                            ('F',1),('F',2)

我需要创建一个找出重复数据的报告。从上面的示例数据中,报告需要显示 cat A 的数据与 cat C 重复(注意 num 值和记录数),并且 cat B 由 cat E 和 F 重复。显示的最佳方法是什么?

示例输出

-------------
|cat | dupby|
-------------
| A  |  C   |
| B  | E, F |
-------------

【问题讨论】:

  • 那么预期的输出是什么?只是包含重复的行? A的前两个集合不也是b的重复集合吗?
  • 嗨,我已经添加了预期的输出,没有。类别的行数需要匹配
  • 通过解决在stackoverflow.com/a/6596590/1679692发布的解决方案解决了这个问题

标签: sql-server-2008-r2 ssrs-2008-r2


【解决方案1】:

更新:仅在最终结果上使用common table expression 和stuff() with select ... for xml path ('') method of string concatenation 切换到传统的集合匹配:

;with cte as (
  select *
    , cnt = count(*) over (partition by cat)
  from t
)
, duplicates as (
  select 
        x.cat
      , dup_cat = x2.cat
  from cte as x 
    inner join cte as x2
       on x.cat < x2.cat
      and x.num = x2.num
      and x.cnt = x2.cnt 
  group by x.cat, x2.cat, x.cnt
  having count(*) = x.cnt
)
select 
    d.cat
  , dupby = stuff((
        select ', '+i.dup_cat
        from duplicates i
        where i.cat = d.cat
        for xml path (''), type).value('.','varchar(8000)')
     ,1,2,'')
from duplicates d
where not exists (
    select 1
    from duplicates i
    where d.cat = i.dup_cat
    )
group by d.cat

rextester 演示:http://rextester.com/KHAG98718

返回:

+-----+-------+
| cat | dupby |
+-----+-------+
| A   | C     |
| B   | E, F  |
+-----+-------+

【讨论】:

  • 哇,感谢@sqlzim 的快速解决方案。看起来它会满足我的要求。我会在一段时间后恢复。
  • 我得到一个转换错误,不是因为你的查询有问题,而是因为在实际数据中,cat是int。
  • 添加了转换功能,查询似乎在运行但耗时太长。
  • 以上脚本适用于较小的集合,但我需要在具有大约 400,000 条记录的表上运行它。此查询阻止了数据库上的其他查询,我不得不在 45 分钟后取消它。
  • @raj 更新为成本更低的集合匹配查询。
猜你喜欢
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2013-12-04
  • 2013-03-22
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多