2016-08-25 64 views
2

我在表中具有此數據。從單列中的不同列中選擇最大日期

create table pick_max_date 
(
student_id int 
,date1 datetime 
,date2 datetime 
,date3 datetime 
,date4 datetime 
) 

insert into pick_max_date 
(student_id,date1,date2,date3,date4)values 
(1,'2015-06-01','2016-01-01','2014-01-01','2017-01-01') 
,(2,'2016-06-01','2017-08-01','2018-01-01','2017-05-06') 
,(3,'2013-06-01','2019-08-01','2012-01-01','2012-05-06') 

select * from pick_max_date 

我需要爲每個學生選擇最大日期,如下所示。

student_id max_date 
    ---------- ---------- 
     1   2017-01-01 
     2   2018-01-01 
     3   2019-08-01 

什麼是最優化的方式選擇如上。任何幫助表示讚賞。

在此先感謝

+2

日期列的數量是否保持不變? – iamdave

回答

0

謝爾蓋Gegoyan描述在下面的鏈接非常有效的四種不同的方式來解決這個問題。我最喜歡的第一個:

LINK

讓我知道,如果你發現它是有用的。

2

構建列的派生表,然後從該表中的最大值,

select student_id, 
     (
     select max(d.d) 
     from (values(date1), 
        (date2), 
        (date3), 
        (date4) 
      ) as d(d) 
     ) as max_date 
from dbo.pick_max_date; 
0
SELECT student_id , 
    (SELECT Max(v) FROM (VALUES (date1), (date2), (date3)) AS value(v)) as maxdate 
FROM pick_max_Date 

SELECT student_id,b.* 
from 
pick_max_Date 
cross apply 
(select max(d) 
from 
(values(date1),(date2),(date3),(date4))v(d) 
)b(maxx) 
0

你可以做任何的values表已經提到的,或者乾脆用一個case如果列是靜態的:

select student_id 

     ,(select max(d) 
      from (values(date1),(date2),(date3),(date4)) as tbl(d)) as MaxDate 

     ,case when date1 >= date2 and date1 >= date3 and date1 >= date4 then date1 
       when date2 >= date1 and date2 >= date3 and date2 >= date4 then date2 
       when date3 >= date1 and date3 >= date2 and date3 >= date4 then date3 
       else date4 
       end as MaxDate2 
from pick_max_date 
相關問題