You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:24:42