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

如何在SQL中仅查询最新记录:针对字段名称含日期标识的场景

解决ID为5580患者的最新记录查询需求

你的核心需求是获取ID为5580的患者的唯一一条最新评估记录,当前的SQL因为使用了GROUP BY多个字段(COL1/COL2/COL3等),只要这些字段存在不同值就会生成多行结果,无法直接得到单条最新记录。这里提供两种可靠的解决方案:

方案1:利用表中现有Date字段(推荐)

既然你的SQL里还能调用at.Date,说明表中保留了这个日期字段,这是判断记录新旧最准确的依据。我们可以用ROW_NUMBER()窗口函数给记录按日期降序编号,只取编号为1的最新记录:

WITH PatientLatestAssessments AS (
    SELECT 
        p.ID,
        at.Date AS latest_date,
        at.[RAPID3 Name] AS COL1,
        at.[DLQI Name] AS COL2,
        at.[HAQ-DI Name] AS COL3,
        phy.name AS phyi,
        at.State_ID,
        -- 按患者ID分组,日期降序排序,最新记录编号为1
        ROW_NUMBER() OVER (PARTITION BY p.ID ORDER BY at.Date DESC) AS record_rank
    FROM dbo.[Assessment Tool] AS at
    INNER JOIN dbo.patient AS p ON p.[ID] = at.[Owner (Patient)_Patient_ID]
    INNER JOIN dbo.[Physician] AS phy ON phy.ID = p.Physician_ID
    WHERE at.State_ID IN (162, 165, 168) AND p.ID = 5580
)
-- 只取最新的那条记录
SELECT ID, latest_date, COL1, COL2, COL3, phyi, State_ID
FROM PatientLatestAssessments
WHERE record_rank = 1;

这个方案的优势:

  • 依赖专门的日期字段,排序逻辑最准确,避免解析字符串可能出现的错误
  • 逻辑清晰,后续维护成本低

方案2:从COL1字段中提取日期排序(备选)

如果确实需要依赖COL1(RAPID3 Name)中的日期信息,假设COL1的格式类似RAPID3_2024-05-20或RAPID3 20240520,可以通过字符串函数提取日期部分并转换为日期类型,再用窗口函数排序:

WITH PatientLatestAssessments AS (
    SELECT 
        p.ID,
        at.[RAPID3 Name] AS COL1,
        at.[DLQI Name] AS COL2,
        at.[HAQ-DI Name] AS COL3,
        phy.name AS phyi,
        at.State_ID,
        -- 从COL1中提取日期部分,转换为DATE类型后降序排序
        ROW_NUMBER() OVER (PARTITION BY p.ID ORDER BY 
            CONVERT(DATE, SUBSTRING(at.[RAPID3 Name], CHARINDEX('_', at.[RAPID3 Name]) + 1, 10), 23) DESC
        ) AS record_rank
    FROM dbo.[Assessment Tool] AS at
    INNER JOIN dbo.patient AS p ON p.ID = at.[Owner (Patient)_Patient_ID]
    INNER JOIN dbo.[Physician] AS phy ON phy.ID = p.Physician_ID
    WHERE at.State_ID IN (162, 165, 168) AND p.ID = 5580
)
SELECT ID, COL1, COL2, COL3, phyi, State_ID
FROM PatientLatestAssessments
WHERE record_rank = 1;

注意事项:

  • 请根据COL1的实际格式调整SUBSTRING和CHARINDEX的参数,确保能准确提取日期字符串
  • 转换日期时要匹配格式代码(比如示例中的23对应YYYY-MM-DD),避免转换失败

为什么你的原SQL会返回多行?

原SQL中GROUP BY包含了at.[RAPID3 Name]、at.[DLQI Name]等字段,只要这些字段的值有差异,就会生成独立的分组,即使max(at.Date)相同,也会返回多条结果,这和你“只取一条最新记录”的需求不符。窗口函数的方式则可以在保留所有字段的同时,精准筛选出最新的单条记录。

内容的提问来源于stack exchange,提问作者Mezameta Yasuo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:22:50