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
相关产品推荐
相关产品推荐

