在MSSQL中查找,合并,然后删除包含一些重复列的行

时间:2014-01-14 13:24:31

标签: sql sql-server

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

ID    |  name    |  surname    |  data1    | data2   | data3
1     |  John    |  Doe        |  jdata1   | jdata2  | null
1     |  John    |  Doe        |  jdata1   | null    | jdata3
2     |  Jane    |  Dame       |  jane1    | null    | jane3
3     |  Jack    |  Horner     |  jack1    | jack2   | null
3     |  Jack    |  Horner     |  jack1    | jack2   | jack3
3     |  Jack    |  Horner     |  jack1    | jack2   | jack3

我希望它看起来像这样:

ID    |  name    |  surname    |  data1    | data2   | data3
1     |  John    |  Doe        |  jdata1   | jdata2  | jdata3
2     |  Jane    |  Dame       |  jane1    | null    | jane3
3     |  Jack    |  Horner     |  jack1    | jack2   | jack3

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

为了使事情复杂化,一些记录只有一行,而其他记录只有三个条目,其中三个相关行中的两个是相同的,另一行表示如前所述的“交换”列。

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

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

您想要聚合:

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;

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

相关问题