Chciałbym porównać daty z tego samego wiersza tabeli i zwrócić najnowszą datę. Przykład poniżej:

table1

id | Date1    | Date2    | Date3    | Date4    |
---|-------------------------------------------    
1  | 01/01/20 | 02/01/20 | 03/01/20 | 04/01/20 |

Wynik w tej instancji byłby 04/01/20

Jestem w stanie to zrobić za pomocą poniższej metody:

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 

To dla mnie czuje się jak złe rozwiązanie i próbuje to zrobić na wielu rekordach, spowodowałoby dużo nad głową.

Czy ktoś może doradzić, jeśli istnieje lepszy sposób na osiągnięcie pożądanego wyniku.

Każda pomoc byłaby bardzo mile widziana

1
Foster90 16 październik 2020, 19:42

1 odpowiedź

Najlepsza odpowiedź

Nie wspominałeś o DBMS.
Dla MySQL, Oracle, Postgres, MariaDB, DB2 można użyć poniżej funkcji.
GREATEST(date1, date2, date3, ...)
W przypadku innych DBMS musisz użyć przypadku, gdy logika taka jak poniżej

case 
when date1> date2 and date2 > date3 then date1
when date2> date1 and date1 > date3 then date2
else date3
end as greatest_date

Edytuj: W przypadku TSQL - możesz użyć poniżej logiki.

SELECT MAX(x.CombinedDate) AS greatest
FROM   table AS u
CROSS APPLY ( VALUES ( u.date1), ( u.date2),( u.date3),( u.date4)) AS x ( CombinedDate )
2
Koushik Roy 16 październik 2020, 17:02