首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server重复数据删除

SQL Server重复数据删除
EN

Stack Overflow用户
提问于 2011-07-26 00:04:09
回答 3查看 485关注 0票数 4

SQL Server 2008,我继承了一个这样的表(74k行):

代码语言:javascript
复制
create table #mess (keycol char(36) , name1 varchar(254) , name2 varchar(254), valuex varchar(254) )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , 'a' , '' , '' )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , '' , 'a' , 'value-a' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , 'b' , '' , 'value-b' )
insert into #mess values ('578F2893-15E6-4877-9FE6-AC2F4F351143' , 'c' , '' , 'value-c' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , '' , 'b' , '' )
insert into #mess values ('FAFCBDFE-D49E-4566-882D-0B6628DA59CC' , '' , 'd' , 'value-d' )

结果集是这样的:

代码语言:javascript
复制
keycol                               name1   name2    valuex
------------------------------------ ------- -------- ------------
971EC307-8514-450D-AE3A-4E25EA3F3A10 a                
971EC307-8514-450D-AE3A-4E25EA3F3A10         a        value-a
04FD0C0B-FC90-405A-BFD6-C3AF2516E51F b                value-b
578F2893-15E6-4877-9FE6-AC2F4F351143 c                value-c
04FD0C0B-FC90-405A-BFD6-C3AF2516E51F         b        
FAFCBDFE-D49E-4566-882D-0B6628DA59CC         d        value-d

我需要这样做(去重和折叠数据,基于keycol何时在两行之间匹配,如果name2为空则使用name1,反之亦然,但始终使用name1和始终使用非空valuex列)。所有的想法都值得欣赏。

谢谢。

代码语言:javascript
复制
keycol                               name1   valuex
------------------------------------ ------- ------------
971EC307-8514-450D-AE3A-4E25EA3F3A10 a       value-a
04FD0C0B-FC90-405A-BFD6-C3AF2516E51F b       value-b
578F2893-15E6-4877-9FE6-AC2F4F351143 c       value-c
FAFCBDFE-D49E-4566-882D-0B6628DA59CC d       value-d
EN

回答 3

Stack Overflow用户

发布于 2011-07-26 00:46:11

顺便说一句--右侧的3列基本上是相同的。您可以删除最右边的值(如'value-a‘等值)然后,在没有惩罚的情况下,将其他两个组合在一起。

无论如何--有几种不同的方式--使用DISTINCT或GROUP BY来获取您想要的内容:

使用DISTINCT:

代码语言:javascript
复制
SELECT DISTINCT
   keycol, 
   Coalesce(NULLIF(name1,''), name2) as name1,
   'Value-' + Coalesce(NULLIF(name1,''), name2) as valuex
FROM
   Table

使用GROUP BY:

代码语言:javascript
复制
SELECT
   keycol, 
   Coalesce(max(nullif(name1,'')), max(name2)) as name1,
   max(valuex)
FROM
   table
Group By
   keycol
票数 1
EN

Stack Overflow用户

发布于 2011-07-26 00:18:32

像这样的东西?

代码语言:javascript
复制
create table #mess (keycol char(36) , name1 varchar(254) , name2 varchar(254), valuex varchar(254) )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , 'a' , '' , '' )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , '' , 'a' , 'value-a' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , 'b' , '' , 'value-b' )
insert into #mess values ('578F2893-15E6-4877-9FE6-AC2F4F351143' , 'c' , '' , 'value-c' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , '' , 'b' , '' )
insert into #mess values ('FAFCBDFE-D49E-4566-882D-0B6628DA59CC' , '' , 'd' , 'value-d' )

select * from #mess

select 
    n1.keycol, coalesce(n1.name1, n2.name1), n1.valuex 
from
    (
        select keycol, max(nullif(name1, '')) name1, max(nullif(valuex, '')) valuex
        from #mess 
        group by keycol) n1
    inner join  (
        select keycol, max(nullif(name2, '')) name1, max(nullif(valuex, '')) valuex
        from #mess 
        group by keycol) n2
        on  n1.keycol = n2.keycol

drop table #mess
票数 0
EN

Stack Overflow用户

发布于 2011-07-26 00:19:09

它看起来就像是这样的数据结构,您总是只需要每个keycol的非空valuex行。您应该能够做到这一点,并通过使用UNION消除空值行来将name1和name2合并在一起,如下所示:

代码语言:javascript
复制
SELECT keycol, name1, valuex
FROM tablename
WHERE valuex != '' AND name1 != ''
UNION
SELECT keycol, name2 AS name1, valuex
FROM tablename
WHERE valuex != '' AND name2 != ''

如果每个keycol总是只有一个有效的valuex行,这应该是可行的。如果您的数据不是这样布局的,请让我知道,我会进一步修改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6819033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档