【问题标题】:Select max date from different columns for a single row从不同列中为单行选择最大日期
【发布时间】:2016-08-25 08:53:05
【问题描述】:

我在表格中有这些数据。

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

如上选择最优化的方法是什么。任何帮助表示赞赏。

提前致谢

【问题讨论】:

  • 日期列数是否保持不变?

标签: tsql sql-server-2012


【解决方案1】:

构造列的派生表并从该表中选择最大值,

select student_id,
       (
       select max(d.d)
       from (values(date1),
                   (date2),
                   (date3),
                   (date4)
            ) as d(d)
       ) as max_date
from dbo.pick_max_date;

【讨论】:

    【解决方案2】:

    Sergey Gegoyan 在以下链接中描述了解决此问题的四种非常有效的方法。我最喜欢第一个:

    LINK

    如果你觉得它有用,请告诉我。

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        【解决方案4】:

        您可以使用已经提到的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
        

        【讨论】:

          猜你喜欢
          • 2014-01-24
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-23
          • 2016-04-24
          相关资源
          最近更新 更多