Я бы предпочел, чтобы вы хранили ваши данные в обычном порядке.Пока это не будет сделано, вы будете прокляты, если для выполнения таких задач вам понадобятся более сложные запросы.
Способ обработки данных, как есть, заключается в использовании функции GREATEST (), но по какой-то причине, известной толькоРазработчики Teradata эта функция не принимает даты, но они могут быть приведены к целым числам, которые она принимает.Также необходимо избегать значений NULL.Это может дать вам самую последнюю дату в строке, и оттуда вы можете использовать ROW_NUMBER (), чтобы получить строки с самой последней датой для идентификатора.
WITH cte AS ( SELECT
ID
, Attr_1
, Attr_2
, Attr_3
, CAST(GREATEST(
CAST(COALESCE(Attr_1_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_2_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_3_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_4_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_5_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_6_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_7_Update_Dt, date '1900-01-01') AS INT)
, CAST(COALESCE(Attr_8_Update_Dt, date '1900-01-01') AS INT)
)as date) as maxdate
FROM yourtable)
SELECT
ID
, Attr_1
, Attr_2
, Attr_3
, maxdate
FROM (
SELECT
ID
, Attr_1
, Attr_2
, Attr_3
, maxdate
, ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY maxdate DESC) as rn
FROM cte
) d
WHERE rn = 1
Я не могу точно оценить производительность этого подхода, вероятно, он лучше всего подходит для стола среднего размера.Если ваша таблица очень большая, тогда я действительно изучу варианты нормализации данных.