Rechercher, Fusionner, puis supprimer des lignes contenant des colonnes en double dans MSSQL

J'ai une table MSSQL qui ressemble à ceci:

 ID |  nom |  nom de famille |  data1 |  data2 |  data3
 1 |  John |  Doe |  jdata1 |  jdata2 |  nul
 1 |  John |  Doe |  jdata1 |  null |  jdata3
 2 |  Jane |  Dame |  jane1 |  null |  jane3
 3 |  Jack |  Horner |  jack1 |  jack2 |  nul
 3 |  Jack |  Horner |  jack1 |  jack2 |  jack3
 3 |  Jack |  Horner |  jack1 |  jack2 |  jack3

et je voudrais qu'il ressemble à ceci:

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

La database est un peu un gâchis – importer à partir d'un file csv, et fondamentalement, chaque logging semble être dupliqué, avec seulement une ou deux colonnes étant différent – ie, la première rangée aura la valeur nulle, et la deuxième rangée aura une valeur cette colonne.

Pour compliquer les choses, certains loggings ont une seule ligne, et d'autres ont trois inputs, où deux des trois lignes connexes sont identiques et l'autre ligne présentant les colonnes «permutées» comme décrit précédemment.

Au total, environ 44 millions de lignes que j'essaie de détecter et de merge – remplissez les valeurs nulles avec les colonnes des lignes dupliquées, puis supprimez les lignes non complétées en double afin qu'il n'y ait toujours qu'une seule ligne par numéro d'ID.

Toute aide très appréciée.

Vous voulez une agrégation:

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

Notez que s'il y a plusieurs valeurs dans l'une des colonnes de données, une seule sera choisie. (Il n'y a aucun exemple de ceci dans vos données d'échantillon.)

MODIFIER:

Si vous voulez changer la table elle-même, je suggère de stocker les résultats dans une table temporaire et de réinsert datatables:

 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; 

Cependant, il est probablement plus facile de simplement conserver la table d'origine et d'utiliser une requête / vue pour extraire datatables au bon format.