С вашим набором данных сложно работать, потому что у вас нет уникального ключа для каждой записи. Наличие уникального ключа значительно упростило бы запрос. Это делает то, о чем вы спрашиваете:
create table #temp ([Key] char(1), [Col 1] varchar(8), [Col 2] varchar(8), [Col 3] int, [Col 4] varchar(10), [Col 5] varchar(10), [Col 6] varchar(10), [Col 7] varchar(10), [Col 8] varchar(10))
insert into #temp values
('A', 'XXX', 'AAA', 5, '20190601', 'PI0104163', '20190429', 'PI0104163', '20190531'),
('A', 'XXX', 'AAA', 5, '20200129', 'PI0113027', '20200303', 'PI0113027', '20190531')
select distinct
t1.[Key]
,t1.[Col 1]
,t1.[Col 2]
,t1.[Col 3]
,[Col 4] = case when t1.[Col 4] < t2.[Col 4] then t1.[Col 4] else t2.[Col 4] end
,[Col 5] = case when t1.[Col 4] < t2.[Col 4] then t1.[Col 5] else t2.[Col 5] end
,[Col 6] = case when t1.[Col 6] > t2.[Col 6] then t1.[Col 6] else t2.[Col 6] end
,[Col 7] = case when t1.[Col 6] > t2.[Col 6] then t1.[Col 7] else t2.[Col 7] end
,t1.[Col 8]
from #temp t1
inner join #temp t2 on
(t1.[Key] = t2.[Key] ) and
(t1.[Col 1] = t2.[Col 1]) and
(t1.[Col 2] = t2.[Col 2]) and
(t1.[Col 3] = t2.[Col 3]) and
( /* do not match a record to itself */
(t1.[Col 4] <> t2.[Col 4]) or
(t1.[Col 5] <> t2.[Col 5]) or
(t1.[Col 6] <> t2.[Col 6]) or
(t1.[Col 7] <> t2.[Col 7])
) and
(t1.[Col 8] = t2.[Col 8])
drop table #temp
Что возвращает эти данные:
Key Col 1 Col 2 Col 3 Col 4 Col 5 Col 6 Col 7 Col 8
---- -------- -------- ----------- ---------- ---------- ---------- ---------- ----------
A XXX AAA 5 20190601 PI0104163 20200303 PI0113027 20190531