#sql-server #tsql
#sql-server #tsql
Вопрос:
Я хотел бы сравнить даты из одной и той же строки таблицы и вернуть самую последнюю дату. Пример ниже:
table1
id | Date1 | Date2 | Date3 | Date4 |
---|-------------------------------------------
1 | 01/01/20 | 02/01/20 | 03/01/20 | 04/01/20 |
Результат в этом случае будет 04/01/20
Я могу сделать это, используя приведенный ниже метод:
DECLARE @id INT;
SET @id = 1;
select MAX(date) from
(select Date1 as date from table1 where id = @id
union
select Date2 from table1 where id = @id
union
select Date3 from table1 where id = @id
union
select Date4 from table1 where id = @id) as t
Мне кажется, что это плохое решение, и попытка сделать это с несколькими записями приведет к большим накладным расходам.
Кто-нибудь может посоветовать, есть ли лучший способ достичь желаемого результата.
Любая помощь будет принята с благодарностью
Комментарии:
1. Вы могли бы добавить
group by
, если было несколько записей
Ответ №1:
Вы не упомянули СУБД.
Для MySQL, Oracle, Postgres, MariaDB, DB2 вы можете использовать приведенную ниже функцию.
GREATEST(date1, date2, date3, ...)
Для других СУБД вам необходимо использовать логику case when, подобную приведенной ниже
case
when date1> date2 and date2 > date3 then date1
when date2> date1 and date1 > date3 then date2
else date3
end as greatest_date
РЕДАКТИРОВАТЬ: для TSQL — вы можете использовать приведенную ниже логику.
SELECT MAX(x.CombinedDate) AS greatest
FROM table AS u
CROSS APPLY ( VALUES ( u.date1), ( u.date2),( u.date3),( u.date4)) AS x ( CombinedDate )
Комментарии:
1. я добавил и другое решение. вы можете проверить это, если у вас слишком много столбцов.