SQL中如何从多列日期字段获取最大值?替代coalesce方案
如何在SQL Server中获取同一行多列日期的最大值
嘿,我懂你的问题啦——你想用coalesce但发现它只返回第一个非空值,而你实际需要的是每行三个日期列里最大的那个日期,对吧?这就给你两个靠谱的解决方案:
方法1:使用子查询结合MAX()函数(灵活易扩展)
这个方法通过VALUES子句把同一行的三个日期转换成一个临时行集,然后对这个行集取最大值,不管后续要加多少个日期列都能轻松扩展:
declare @t table (date1 date,date2 date,date3 date) insert into @t values ('2019-01-01','2019-01-20','2019-02-10') insert into @t values (null,null,'2019-02-01') insert into @t values (null,'2019-02-01','2019-02-02') -- 正确查询:获取每行的最大日期 SELECT (SELECT MAX(d) FROM (VALUES(date1), (date2), (date3)) AS v(d)) AS maxdate FROM @t;
运行这个查询后,你会得到完全符合预期的结果:
maxdate ---------- 2019-02-10 2019-02-01 2019-02-02
方法2:使用CASE语句手动比较(适合少量列的场景)
如果你的日期列数量固定且不多,也可以用CASE语句逐一比较列的值,找出最大的那个:
SELECT CASE WHEN date1 >= date2 AND date1 >= date3 THEN date1 WHEN date2 >= date1 AND date2 >= date3 THEN date2 ELSE date3 END AS maxdate FROM @t;
这个方法也能得到同样的结果,但如果后续要增加更多日期列,修改起来会比方法1麻烦一些。
为什么coalesce不适用?
再补充下你提到的coalesce的问题:它的逻辑是按参数顺序返回第一个非空值,而不是比较大小。比如第三行的date1是null,date2是2019-02-01,coalesce就直接返回这个值了,但你需要的是更大的2019-02-02,所以它完全不符合你要“取最大值”的需求哦。
内容的提问来源于stack exchange,提问作者Red Devil
相关产品推荐
相关产品推荐

