In my table I have rows, and each row has some data and its version. When column is not-null, it overrides an old value otherwise nothing happens.
Pseudocode (in C#)
var resultTable = new List<Row>();
foreach (var group in table.GroupBy(x => x.ID).Select(g => g.OrderBy(x => x.Priority)))
{
var row = Row.GetEmpty();
foreach (var anotherRow in group)
{
foreach (var column in group.Columns)
{
if (column.GetValue(anotherRow) != null)
column.SetValue(row, anotherRow);
}
}
resultTable.Add(row);
}
I adopted a script from a link below, but it seems to work with known rows. Can it be done for an unknown number of columns (like SELECT *
does)? I mean I have multiple tables, and I really don't want to use dynamic SQL or write tens of stored procedures to implement MergeTable1
, MergeTable2
and so on.
Current script for a test table:
CREATE TABLE [dbo].[T](
[id] [int] NOT NULL,
[A] [int] NULL,
[B] [int] NULL,
[C] [int] NULL,
[Priority] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-20160204-122857] ON [dbo].[T]
(
[id] ASC,
[Priority] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
INSERT [dbo].[T] ([id], [A], [B], [C], [Priority]) VALUES (1, NULL, 3, 4, 1)
GO
INSERT [dbo].[T] ([id], [A], [B], [C], [Priority]) VALUES (1, 5, 6, NULL, 2)
GO
INSERT [dbo].[T] ([id], [A], [B], [C], [Priority]) VALUES (1, 8, NULL, NULL, 3)
GO
INSERT [dbo].[T] ([id], [A], [B], [C], [Priority]) VALUES (2, 634, 346, 359, 1)
GO
INSERT [dbo].[T] ([id], [A], [B], [C], [Priority]) VALUES (2, 34, NULL, 734, 2)
GO
input:
id A B C Priority
1 NULL 3 4 1
1 5 6 NULL 2
1 8 NULL NULL 3
2 634 346 359 1
2 34 NULL 734 2
desired result:
id A B C
1 8 6 4
2 34 346 734