T-SQL技术问题:使用MAX函数、CTE与CASE筛选最新安置日期
使用MAX()函数结合CTE筛选指定日期范围的最新安置记录
需求说明
- 核心目标:获取最新的安置日期,同时借助CTE(公共表表达式)筛选出日期落在「当前日期往前90天到往前50天」区间内的记录
- 日期区间定义:通过变量
@Rangefrom和@Rangetill设定,这里需要注意变量赋值的逻辑:@Rangetill是更早的时间点(往前推90天),@rangefrom是较近的时间点(往前推50天)
完善后的SQL代码示例
BEGIN DECLARE @Rangetill DATE, @Rangefrom DATE -- 修正日期区间赋值顺序,确保起始时间早于结束时间 SET @Rangetill = DATEADD(day, -90, GETDATE()) SET @rangefrom = DATEADD(day, -50, GETDATE()); WITH Table_CTE (Name, ID, Rangefrom, Rangetill, StatusID, LatestPlacementDate) AS ( SELECT PE.Personname + ' ' + PE.Surname AS [Name], A.ApplicantId, @rangefrom AS [Expiry warning from], @Rangetill AS [Expiry warning till], A.StatusID, -- 用MAX()聚合函数获取对应申请人的最新安置日期 MAX(A.PlacementDate) AS LatestPlacementDate FROM Applicants A JOIN Persons PE ON A.PersonID = PE.PersonID -- 假设存在关联的人员信息表 WHERE -- 筛选安置日期落在指定区间内的记录 A.PlacementDate BETWEEN @Rangetill AND @rangefrom GROUP BY PE.Personname, PE.Surname, A.ApplicantId, A.StatusID ) -- 从CTE中提取最终筛选后的结果 SELECT * FROM Table_CTE END
关键细节说明
- 日期区间逻辑修正:原代码中变量赋值顺序可能导致区间逻辑错误,调整后确保
BETWEEN条件的起始时间早于结束时间,符合常规日期范围筛选逻辑 - MAX()函数的用法:通过
MAX(A.PlacementDate)配合GROUP BY,为每个申请人单独聚合出最新的安置日期,避免重复记录 - CTE的优势:将筛选、聚合和字段格式化逻辑封装到CTE中,让代码结构更清晰,后续修改筛选条件或扩展字段时更便捷
内容的提问来源于stack exchange,提问作者A.Chandler
相关产品推荐
相关产品推荐

