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

SQL Server 2014:按课程分组关联版本并生成关联ID的实现求助

嘿,针对你在SQL Server 2014里处理培训版本关联ID的需求,我给你整理了两种实用的解决方案,你可以根据自己表的实际结构调整:

方案1:使用递归CTE构建版本链并生成关联ID

这个方案适合版本链存在多层回溯(比如v3→v2→v1),甚至有分支的场景,核心思路是先定位每个课程的最新版本(没有被其他版本作为「上一版本」的记录),再递归向上关联所有历史版本,给同一条版本链分配统一的组ID。

假设你的表结构是:TrainingVersions (CourseID int, LastVersion varchar(20), CurrentVersion varchar(20)),可以用下面的SQL实现:

WITH VersionHierarchy AS (
    -- 锚点成员:定位每个课程的最新版本(没有被其他版本引用为上一版本的记录)
    SELECT 
        CourseID,
        LastVersion,
        CurrentVersion,
        -- 为每个课程的版本链生成唯一组ID
        ROW_NUMBER() OVER (PARTITION BY CourseID ORDER BY (SELECT NULL)) AS VersionGroupID,
        1 AS IsLatestVersion -- 标记当前记录为该课程的最新版本
    FROM TrainingVersions tv
    WHERE NOT EXISTS (
        SELECT 1 FROM TrainingVersions tv2 
        WHERE tv2.LastVersion = tv.CurrentVersion AND tv2.CourseID = tv.CourseID
    )

    UNION ALL

    -- 递归成员:向上关联所有历史版本,继承同一组ID
    SELECT 
        tv.CourseID,
        tv.LastVersion,
        tv.CurrentVersion,
        vh.VersionGroupID,
        0 AS IsLatestVersion
    FROM TrainingVersions tv
    JOIN VersionHierarchy vh ON tv.CurrentVersion = vh.LastVersion AND tv.CourseID = vh.CourseID
)
SELECT 
    CourseID,
    LastVersion,
    CurrentVersion,
    VersionGroupID,
    -- 明确显示该版本链的最新版本
    CASE WHEN IsLatestVersion = 1 THEN CurrentVersion ELSE NULL END AS LatestVersion
FROM VersionHierarchy
ORDER BY CourseID, VersionGroupID, IsLatestVersion DESC;
方案2:使用窗口函数+自关联(适用于线性版本链)

如果你的版本号是可排序的格式(比如v1/v2/v3、日期字符串或数字),且每个课程的版本链是线性的(一个版本只有一个后续版本),可以用更简洁的窗口函数方案:

WITH CourseLatestVersions AS (
    -- 先找到每个课程的最新版本(利用版本号的排序性)
    SELECT 
        CourseID,
        MAX(CurrentVersion) AS LatestVersion
    FROM TrainingVersions
    GROUP BY CourseID
),
VersionGroups AS (
    -- 给同课程的所有版本分配统一的组ID
    SELECT 
        tv.CourseID,
        tv.LastVersion,
        tv.CurrentVersion,
        clv.LatestVersion,
        -- 用「课程ID+最新版本」作为组ID,保证唯一性
        CONCAT(tv.CourseID, '-', clv.LatestVersion) AS VersionGroupID
    FROM TrainingVersions tv
    JOIN CourseLatestVersions clv ON tv.CourseID = clv.CourseID
)
SELECT * FROM VersionGroups ORDER BY CourseID, VersionGroupID;

小提示

  • 如果你的版本号是无法直接排序的自定义字符串,优先选择递归CTE方案;
  • 可以根据实际需求调整VersionGroupID的生成规则(比如用NEWID()生成全局唯一ID,或者用课程ID+最新版本的哈希值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:30:48