Самая высокая дата изменения среди нескольких таблиц

У нас есть частая проблема, с которой мы сталкиваемся во время ETL, и я надеюсь, что кто-то здесь решил ее раньше. Предположим, у нас есть три иерархические таблицы: заголовочная, подробная и транзакционная. Исходная система может обновить запись в любой из них и обновит только дату последнего изменения измененной таблицы. Когда мы запускаем ETL, нам нужно вытащить все заголовки и все их детали и транзакции, если какой-либо из уровней изменился.

Для строк мы можем использовать функцию max, но для столбцов есть ли простой способ вернуть самую высокую дату из трех отдельных столбцов? Мы могли бы сделать это с помощью вложенного оператора case, но это становится беспорядочным, когда у вас задействовано более 7 таблиц. Независимый от БД подход был бы замечательным, но мы используем Azure/SQL Server. Мы ценим любые предложения!


person James    schedule 13.05.2020    source источник
comment
В ходе некоторых исследований было найдено приведенное ниже решение, которое, по-видимому, работает для Azure. Мы не проверяли производительность, но пока это лучшее, что мы нашли. Я по-прежнему приветствую любые предложения относительно альтернатив или лучшего подхода: выберите A.Date1, A.Date2, A.Date3, (SELECT MAX(DateAlias) FROM (VALUES (A.Date1), (A.Date2), (A. Date3)) T (DateAlias)) AS LatestDate from TableName A;   -  person James    schedule 14.05.2020
comment
На самом деле, только из ваших вопросов мы не можем понять, что на самом деле вы хотите сделать. Как выглядят данные таблицы и какие выходные данные вам нужны. Я рад слышать, что вы нашли лучшее решение. Просто попробуйте, и вы можете опубликовать ответ самостоятельно.   -  person Leon Yue    schedule 15.05.2020


Ответы (1)


В ходе некоторых исследований было найдено приведенное ниже решение, которое, по-видимому, работает для Azure. Мы не проверяли производительность, но пока это лучшее, что мы нашли. Я по-прежнему приветствую любые предложения относительно альтернатив или лучшего подхода:

select 
A.Date1, 
A.Date2, 
A.Date3, 
(SELECT MAX(DateAlias) FROM (VALUES (A.Date1), (A.Date2), (A.Date3)) T (DateAlias)) AS LatestDate 
from TableName A;
person James    schedule 15.05.2020