2016-08-25 2 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は、この問題を解決するための非常に効率的な4つの異なる方法以下のリンクで説明します。私はほとんどの最初のものを好むだろう:

LINK

は、あなたはそれが有用であることが分かった場合、私に教えてください。

2

あなたは既に述べたvaluesテーブルのいずれかの操作を行い、または単に使用することができます

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

、列の派生テーブルを作成し、そのテーブルから最大を選択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 
関連する問題