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

获取用户最新SOP记录问题求助:SQL返回全部记录而非最新版本

SQL查询返回所有SOP记录?教你仅获取每个SOP的最新版本

我明白你的问题——你现在的SQL查询返回了全部SOP记录,但你只想要每个SOP的最新版本(通过Reference字段末尾的两位数字判断,比如SOP/QA01/02比SOP/QA01/01新)。我们来一步步修复这个问题。

问题分析

你的现有查询存在两个核心问题:

  1. 字段错误:你写了MAX(PR.Name) AS Reference,这明显是笔误,应该使用PR.Reference字段来获取SOP的版本标识。
  2. 分组逻辑错误:GROUP BY子句包含了PR.ID,而ID是每条记录的唯一标识,这会导致每一行都被单独分组,MAX函数根本无法筛选出每个SOP的最新版本。

解决方案

我们先通过CTE(公共表表达式)找出每个用户下每个SOP的最新版本,再关联原表获取完整的记录信息:

WITH LatestSOP AS (
    SELECT 
        PR.Responsible_Name AS Name,
        -- 提取SOP的基础标识(去掉末尾的版本号部分)
        LEFT(PR.Reference, LEN(PR.Reference) - 3) AS SOP_Base,
        -- 提取末尾两位版本号并转成整数,取最大值
        MAX(CAST(RIGHT(PR.Reference, 2) AS INT)) AS Latest_Version
    FROM PR
    GROUP BY PR.Responsible_Name, LEFT(PR.Reference, LEN(PR.Reference) - 3)
)
SELECT 
    PR.ID AS RecordID, 
    PR.Parent_ID, 
    PR.Responsible_Name AS Name, 
    PR.Reference, 
    TT.S_Value AS Title, 
    EU.S_Value AS Unit, 
    ED.S_Value AS Dept, 
    ES.S_Value As Site, 
    EDV.S_Value AS Div, 
    ST.NAME AS Status 
FROM PR
-- 关联CTE,筛选出最新版本的记录
INNER JOIN LatestSOP LS 
    ON PR.Responsible_Name = LS.Name
    AND LEFT(PR.Reference, LEN(PR.Reference) - 3) = LS.SOP_Base
    AND CAST(RIGHT(PR.Reference, 2) AS INT) = LS.Latest_Version
-- 保留原有的关联表
INNER JOIN TW_V_Training_Title TT ON PR.ID = TT.PR_ID 
INNER JOIN PR_Status_Type ST ON PR.Status_Type = ST.ID 
INNER JOIN TW_V_Employee_Department ED ON PR.Parent_ID = ED.PR_ID 
INNER JOIN TW_V_Employee_Unit EU ON PR.Parent_ID = EU.PR_ID 
INNER JOIN TW_V_Employing_Site ES ON PR.Parent_ID = ES.PR_ID 
INNER JOIN TW_V_Employee_Division EDV ON PR.Parent_ID = EDV.PR_ID;

代码解释

1. CTE部分(LatestSOP)

  • LEFT(PR.Reference, LEN(PR.Reference) - 3):提取SOP的基础部分,比如把SOP/QA01/01转为SOP/QA01/,IS.01.06转为IS.01.,确保同一个SOP的不同版本能被归为一组。
  • MAX(CAST(RIGHT(PR.Reference, 2) AS INT)):提取Reference末尾的两位数字,转成整数后取最大值,得到每个SOP的最新版本号。
  • 按Responsible_Name(用户名)和SOP_Base分组,确保每个用户下的每个SOP都能找到对应的最新版本。

2. 主查询部分

  • 将原PR表与CTE关联,通过用户名、SOP基础标识和版本号,精准筛选出仅属于最新版本的记录。
  • 保留你原来的所有关联表,确保能获取到Title、Unit、Dept等完整业务字段。

注意事项

如果你的Reference格式有变化(比如版本号是三位,或者分隔符不同),可以调整提取逻辑:

  • 若版本号是三位:将RIGHT(PR.Reference, 2)改为RIGHT(PR.Reference, 3),同时把LEN(PR.Reference)-3改为LEN(PR.Reference)-4。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:37:30