【问题标题】:Find, Merge, then delete rows containing some duplicate columns in MSSQL在 MSSQL 中查找、合并,然后删除包含某些重复列的行
【发布时间】:2014-01-14 13:24:31
【问题描述】:

我有一个如下所示的 MSSQL 表:

身份证 |姓名 |姓氏 |数据1 |数据2 |数据3 1 |约翰 |能源部 |数据1 |数据2 |空值 1 |约翰 |能源部 |数据1 |空 |数据3 2 |简 |夫人 |简1 |空 |简3 3 |杰克 |霍纳 |插孔1 |杰克2 |空值 3 |杰克 |霍纳 |插孔1 |杰克2 |插孔3 3 |杰克 |霍纳 |插孔1 |杰克2 |插孔3

我希望它看起来像这样:

身份证 |姓名 |姓氏 |数据1 |数据2 |数据3 1 |约翰 |能源部 |数据1 |数据2 |数据3 2 |简 |夫人 |简1 |空 |简3 3 |杰克 |霍纳 |插孔1 |杰克2 |插孔3

数据库有点乱——从 csv 文件导入,基本上,每条记录似乎都是重复的,只有一两列不同——即第一行为空,第二行为该列中的值。

更复杂的是,一些记录只有一行,而另一些记录有三个条目,其中三个相关行中的两个相同,而另一行显示如前所述的“交换”列。

总共有大约 44m 行,我试图检测和合并 - iow,用重复行中的列填充空值,然后删除重复的、不完整的行,这样每个 ID 总是只有一行号码。

非常感谢任何帮助。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    你想要一个聚合:

    select id, name, surname,
           max(data1) as data1, max(data2) as data2, max(data3) as data3
    from table t
    group by id, name, surname;
    

    请注意,如果其中一个数据列中有多个值,则只会选择一个。 (您的示例数据中没有这方面的示例。)

    编辑:

    如果您想更改表本身,我建议将结果存储在临时表中并重新插入数据:

    select id, name, surname,
           max(data1) as data1, max(data2) as data2, max(data3) as data3
    into #tmp
    from table t
    group by id, name, surname;
    
    truncate table t;
    
    insert into t(id, name, surname, data1, data2, data3)
        select id, name, surname, data1, data2, data
        from table t;
    

    但是,保留原始表并使用查询/视图以正确的格式提取数据可能更容易。

    【讨论】:

    • @Monty 要求用其他行的值更新表,所以这个 select 语句不会有太大帮助..
    • 不,这个解决方案很好。它允许您将聚合值保存到临时表中,并在替换它们之前与原始值进行比较。这样做有很多好处。
    • @NickyvV 。 . .我发现 OP 的意图对于是否必须更改表 真的 或是否必须以正确的方式组合数据有点模棱两可。无论如何,修改代码以重新填充表格很容易。
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2020-05-25
    • 2021-10-18
    相关资源
    最近更新 更多