在MS SQL Server中如何获取每行12个关联日期的最小/最大值?
获取每行的最小和最大日期(MS SQL Server)
当然可以实现!针对你这种单条患者记录里包含12个关联日期列的场景,MS SQL Server有几种实用的方法,下面分情况给你具体示例:
方法1:兼容所有SQL Server版本(推荐)
如果你的SQL Server版本低于2022,或者需要保证全版本兼容性,可以用CROSS APPLY结合VALUES子句把每行的多个日期列转换成行,再对这些行做聚合计算。假设你的视图里的日期列是date_1、date_2...date_12,示例代码如下:
SELECT v.patientId, MIN(d.date_value) AS earliest_date, MAX(d.date_value) AS latest_date FROM YourViewName v CROSS APPLY ( VALUES (v.date_1), (v.date_2), (v.date_3), (v.date_4), (v.date_5), (v.date_6), (v.date_7), (v.date_8), (v.date_9), (v.date_10), (v.date_11), (v.date_12) ) d(date_value) GROUP BY v.patientId;
关键说明:
CROSS APPLY会把每行的12个日期列拆成12条行记录,让我们能轻松对这些分散的日期做最小/最大值计算。- 如果某些日期列可能为
NULL,MIN()和MAX()会自动忽略空值,只统计非空的有效日期。
方法2:SQL Server 2022及以上版本简化写法
从SQL Server 2022开始,官方新增了LEAST()和GREATEST()函数,能直接在单行内比较多个值并返回最小/最大值,写法更简洁:
SELECT patientId, LEAST(date_1, date_2, date_3, date_4, date_5, date_6, date_7, date_8, date_9, date_10, date_11, date_12) AS earliest_date, GREATEST(date_1, date_2, date_3, date_4, date_5, date_6, date_7, date_8, date_9, date_10, date_11, date_12) AS latest_date FROM YourViewName;
关键说明:
LEAST()返回参数列表中的最小值,GREATEST()返回最大值,逻辑和方法1完全一致。- 同样会自动忽略
NULL值,只要该行存在至少一个非空日期,就能得到正确结果。
记得把代码里的YourViewName替换成你实际的视图名称,date_1到date_12替换成你视图里对应的日期列名哦!
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

