我有一个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总是只有一行号。
任何帮助都非常感激。
答案 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;
但是,保留原始表并使用查询/视图以正确的格式提取数据更容易。