Чтобы отфильтровать строки без значений даты, вам нужно выражение where, например:
where date1 is not null or date2 is not null or date3 is not null -- All date columns
Вы можете немного сократить это, если вы пишете, используя COALESCE :
where COALESCE(date1, date2, date3, date4, date5) is not null
Затем вам нужно сгруппировать оставшиеся строки по ID
и агрегировать значения даты. Я полагаю, что ваши данные предполагают наличие только одного значения даты по идентификатору в одном столбце, поэтому вы можете использовать любую функцию агрегирования, но в случае нескольких значений даты определите, какую дату вы хотите получить. Я предполагаю, что вы хотите получить самую последнюю дату, поэтому я напишу запрос, используя функцию MAX .
Таким образом, окончательный запрос может выглядеть так:
select
ID
, MAX(date1) as date1
, MAX(date2) as date2
, MAX(date3) as date3
, MAX(date4) as date4
, MAX(date5) as date5
-- Rest of the dates columns aggregated the same way
from MyTable
where COALESCE(date1, date2, date3, date4, date5 /* Rest of the date columns */) is not null
group by ID