2016-08-25 65 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 
相关问题